Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DBCP连接池_Java_Jdbc_Connection Pooling_Dbcp - Fatal编程技术网

Java DBCP连接池

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;

请问下面的代码是否正确地使用了连接池(DBCP)

我提供BasicDataSource的实用程序类如下(与apache示例几乎相同)

然后,我将上述内容用作:

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-method
synchronized
是性能最差的解决方案。我最好选择holder类惯用法(提供的链接中的Bill Pugh Singleton实现),在检查了一点之后,似乎
BasicDataSource
与(几乎)一样是线程安全的它的所有变量都是以sync.methods的方式读/写的。那么,您建议的这些度量是否真的需要?@funkyjelly我指出的问题可能发生在两个线程调用
BasicDataSource getDataSource()时
同时。两者都将看到
datasource==null
,并将创建
BasicDataSource
的两个实例,因此您基本上建议只更改
DatabaseUtility
类中的方法声明,如下所示(例如使其同步?
公共同步静态BasicDataSource getDataSource(Properties prop){…
@funkyjelly-Making-method
synchronized
是性能最差的解决方案。我最好选择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;
    }
}