Java DBCP连接池
请问下面的代码是否正确地使用了连接池(DBCP) 我提供BasicDataSource的实用程序类如下(与apache示例几乎相同) 然后,我将上述内容用作:Java DBCP连接池,java,jdbc,connection-pooling,dbcp,Java,Jdbc,Connection Pooling,Dbcp,请问下面的代码是否正确地使用了连接池(DBCP) 我提供BasicDataSource的实用程序类如下(与apache示例几乎相同) 然后,我将上述内容用作: public class MyClass { public static boolean isNew(Properties prop, String label) { Connection connection = null; PreparedStatement ps = null;
public class MyClass {
public static boolean isNew(Properties prop, String label) {
Connection connection = null;
PreparedStatement ps = null;
try {
BasicDataSource dataSource = DatabaseUtility.getDataSource(prop);
connection = dataSource.getConnection();
ps = connection.prepareStatement("Select * from my_table where LABEL = CAST( ? AS CHAR(35))");
ps.setString(1, label);
if (ps.executeQuery().isBeforeFirst()) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ps != null)
ps.close();
if (connection != null)
connection.close();
} catch (SQLException e) {
System.out.println("Error while closing resource :");
e.printStackTrace();
}
}
return true;
}
}
类MyClass可能被多个派生线程使用。
我没有看到该代码的任何潜在问题
非常感谢如果多个不同的线程第一次调用
DatabaseUtility.getDataSource
,您可能会遇到问题。您可能会得到多个数据源实例。阅读此链接了解线程安全惰性单例初始化:如果多个不同的线程将首次调用DatabaseUtility.getDataSource
,您可能会遇到问题。您可能会得到多个数据源实例。阅读此链接了解线程安全惰性单例初始化:如果切换到池,连接验证设置将自动处理。查看池中的一些陷阱,例如:
DatabaseUtility
类中的方法声明,如下所示(例如使其同步?public synchronized static BasicDataSource getDataSource(Properties){…
@funkyjelly-Making-methodsynchronized
是性能最差的解决方案。我最好选择holder类惯用法(提供的链接中的Bill Pugh Singleton实现),在检查了一点之后,似乎BasicDataSource
与(几乎)一样是线程安全的它的所有变量都是以sync.methods的方式读/写的。那么,您建议的这些度量是否真的需要?@funkyjelly我指出的问题可能发生在两个线程调用BasicDataSource getDataSource()时
同时。两者都将看到datasource==null
,并将创建BasicDataSource
的两个实例,因此您基本上建议只更改DatabaseUtility
类中的方法声明,如下所示(例如使其同步?公共同步静态BasicDataSource getDataSource(Properties prop){…
@funkyjelly-Making-methodsynchronized
是性能最差的解决方案。我最好选择holder类习惯用法(提供的链接中的Bill Pugh Singleton实现),经过仔细检查后,似乎BasicDataSource
与(几乎)一样是线程安全的它的所有变量都是以sync.methods的方式读/写的。那么,您建议的这些度量是否真的需要?@funkyjelly我指出的问题可能发生在两个线程调用BasicDataSource getDataSource()时
同时。两者都将看到datasource==null
,并将根据DBCP文档创建两个BasicDataSource
实例,testOnBorrow默认为true。您是否看到可能缺少的任何其他关键配置?如果我没有弄错的话,我应该会很好地使用默认设置。@funkyjelly您是对的,removed了答案的这一部分。我不确定新的2.5+DBCP与HikariCP相比如何。在旧版本的DBCP中有一些问题,我添加了一些链接来突出这个问题。根据DBCP文档,testOnBorrow默认为true。您是否看到可能缺少的任何其他关键配置?如果我没有弄错,我应该使用默认的set up.@funkyjelly你是对的,删除了答案的这一部分。我不确定新的2.5+DBCP与HikariCP相比如何。在旧版本的DBCP中有一些问题,我添加了一些链接来突出这个问题。
public class MyClass {
public static boolean isNew(Properties prop, String label) {
Connection connection = null;
PreparedStatement ps = null;
try {
BasicDataSource dataSource = DatabaseUtility.getDataSource(prop);
connection = dataSource.getConnection();
ps = connection.prepareStatement("Select * from my_table where LABEL = CAST( ? AS CHAR(35))");
ps.setString(1, label);
if (ps.executeQuery().isBeforeFirst()) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ps != null)
ps.close();
if (connection != null)
connection.close();
} catch (SQLException e) {
System.out.println("Error while closing resource :");
e.printStackTrace();
}
}
return true;
}
}