Пул соединений DBCP - PullRequest
       60

Пул соединений DBCP

0 голосов
/ 27 сентября 2018

Не могли бы вы спросить, будет ли приведенный ниже код корректно использовать пул соединений (DBCP)?

Мой служебный класс, предоставляющий 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;
    }
}

Класс MyClass может использоваться несколькими порожденными потоками.Есть ли потенциальные проблемы с этими кодами, которые я не вижу?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

если вы переключитесь на HikariCP пул, настройки проверки соединения будут выполнены автоматически.Взгляните на несколько ошибок в пулах, например:

0 голосов
/ 27 сентября 2018

Вы можете столкнуться с проблемами, если несколько разных потоков будут вызывать DatabaseUtility.getDataSource в первый раз.Вы можете получить несколько экземпляров своего источника данных.Прочитайте эту ссылку для поточной безопасной ленивой одиночной инициализации: https://www.geeksforgeeks.org/java-singleton-design-pattern-practices-examples

...