高效利用 JDBC 数据库连接

问题描述 投票:0回答:1

我有一个 Java 服务,在其中侦听配置的通道/队列上传入的 IBM MQ 消息。 根据业务逻辑,我有四种类型的消息。对于每种类型,在另一个数据库的配置表(例如 T)中维护着 MS Sql 数据库连接字符串的映射。

因此,对于收到的每条消息,取决于收到的消息类型:

  1. 我从上面的表T中检索相应的数据库连接字符串。
  2. 使用以下代码连接到数据库并执行存储过程(MySP):

连接 dbConn = null;

try { 

dbConn = DriverManager.getConnection(dblUrl, "testusername", "testpassword");

CallableStatement cstmt = con.prepareCall("{call MySP()}");

ResultSet rs = cstmt.executeQuery();

}
catch(Exception ex){

//Handle and log exceptions here.

}

finally{

if (dbConn != null) {

 dbConn.close(); 

}

}

我的问题是:这种动态连接到数据库的方法在 Java 性能/内存使用方面是否是正确的方法,特别是当消息量足够大时? 或者有更好的方法在Java中做到这一点?

谢谢。

java performance jdbc database-connection
1个回答
0
投票

DataSource

从上面这个表T中检索对应的数据库连接字符串。

将连接字符串存储在另一个数据库中就可以了。但通常最好使用

DataSource
接口,而不是硬编码数据库身份验证。

您可以从各种来源获取

DataSource
的特定于数据库引擎的实现。 JDBC 驱动程序通常附带一个基本驱动程序。

对于 Connector/J JDBC 驱动程序,请参阅 文档

DataSource fetchDataSource() 
{
    com.mysql.cj.jdbc.MysqlDataSource ds = new com.mysql.cj.jdbc.MysqlDataSource() ;
    ds.setUser( … ) ;
    ds.setPassword( … ) ;
    …
}

或者,您可以从名称/目录服务检索

DataSource
对象。该服务可能内置于您的 Jakarta EE 应用服务器中,也可能是其他服务器,例如 LDAP 服务器。

池化

如果您决定使用连接池,您的

DataSource
对象可以由使用所述池的实现支持。

关于连接池,许多人建议使用它们,因为他们假设获取新的数据库连接是一个漫长的过程,因此成本高昂。在我有限的测试中我没有看到这笔费用。因此,如果没有足够的证据证明池化可以解决重大问题,我个人不愿意承担回收连接的风险。但是,再次强调,使用

DataSource
允许您切换到池化或关闭池化,而不会破坏您的应用程序。这样的数据库连接配置应该是系统管理员的任务,而不是程序员的问题。

dbConn = DriverManager.getConnection

在现代Java中,很少需要调用

DriverManager
。多年前对 JDBC 进行了重新设计,以通过 Java 服务提供商接口 (SPI) 工具自动加载和注册所有 JDBC 驱动程序。除了极少数情况外,这在所有情况下都有效。

© www.soinside.com 2019 - 2024. All rights reserved.