DBCP 连接池
DBCP Connection pooling
请问下面的代码是否可以正确使用连接池 (DBCP)?
我的实用程序 class 提供 BasicDataSource 如下(几乎与 apache 示例相同)
public class DatabaseUtility {
private static BasicDataSource dataSource;
public static BasicDataSource getDataSource(Properties prop) {
if (dataSource == null)
{
BasicDataSource ds = new BasicDataSource();
ds.setUrl("jdbc:oracle:thin:@"+ prop.getProperty("db") + ":" + prop.getProperty("dbPort") + "/" +
prop.getProperty("dbService"));
ds.setUsername(prop.getProperty("dbUser"));
ds.setPassword(prop.getProperty("dbPassword"));
ds.setMinIdle(5);
ds.setMaxIdle(10);
ds.setMaxOpenPreparedStatements(100);
dataSource = ds;
}
return dataSource;
}
然后我将上面的用作:
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;
}
}
Class MyClass 可能被多个生成的线程使用。
我没有看到此代码的任何潜在问题?
非常感谢
如果多个不同的线程将首次调用 DatabaseUtility.getDataSource
,您可能会遇到问题。您最终可能会得到多个数据源实例。阅读此 link 以了解线程安全的惰性单例初始化:https://www.geeksforgeeks.org/java-singleton-design-pattern-practices-examples
如果您切换到 HikariCP 池,连接验证设置将自动处理。查看池中的一些问题,例如:
请问下面的代码是否可以正确使用连接池 (DBCP)?
我的实用程序 class 提供 BasicDataSource 如下(几乎与 apache 示例相同)
public class DatabaseUtility {
private static BasicDataSource dataSource;
public static BasicDataSource getDataSource(Properties prop) {
if (dataSource == null)
{
BasicDataSource ds = new BasicDataSource();
ds.setUrl("jdbc:oracle:thin:@"+ prop.getProperty("db") + ":" + prop.getProperty("dbPort") + "/" +
prop.getProperty("dbService"));
ds.setUsername(prop.getProperty("dbUser"));
ds.setPassword(prop.getProperty("dbPassword"));
ds.setMinIdle(5);
ds.setMaxIdle(10);
ds.setMaxOpenPreparedStatements(100);
dataSource = ds;
}
return dataSource;
}
然后我将上面的用作:
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;
}
}
Class MyClass 可能被多个生成的线程使用。 我没有看到此代码的任何潜在问题?
非常感谢
如果多个不同的线程将首次调用 DatabaseUtility.getDataSource
,您可能会遇到问题。您最终可能会得到多个数据源实例。阅读此 link 以了解线程安全的惰性单例初始化:https://www.geeksforgeeks.org/java-singleton-design-pattern-practices-examples
如果您切换到 HikariCP 池,连接验证设置将自动处理。查看池中的一些问题,例如: