我有一个 Java 服务,在其中侦听配置的通道/队列上传入的 IBM MQ 消息。 根据业务逻辑,我有四种类型的消息。对于每种类型,在另一个数据库的配置表(例如 T)中维护着 MS Sql 数据库连接字符串的映射。
因此,对于收到的每条消息,取决于收到的消息类型:
连接 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中做到这一点?
谢谢。
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 驱动程序。除了极少数情况外,这在所有情况下都有效。