powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Независимые подключения к бд MSSQL из разных потоков
15 сообщений из 15, страница 1 из 1
Независимые подключения к бд MSSQL из разных потоков
    #38827377
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем, привет

Что-то я не пойму что я делаю не так.
Есть приложение где в основном потоке создаются несколько потоков от 1 до 20. В каждом потоке при его создании я вызываю метод

Код: java
1.
2.
3.
            DriverManager.registerDriver(new net.sourceforge.jtds.jdbc.Driver());
            con = DriverManager.getConnection(URL, username, password);
            con.setAutoCommit(false);



Как я понимаю таким образом я открываю подключение к БД. Дальше я создаю несколько statement и тд. Все прекрасно работает до тех пор пока я в одном из потоков не вызову метод

Код: java
1.
          con.close();



После этого Connection становится закрытым во всех потоках. Что я делаю не так?
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827382
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, собственно, вас удивляет?
Что состояние объекта может необратимо изменяться, а эти изменения будут видны во всём приложении, а не только в потоке, который произвёл изменения?
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827386
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Объект con создается в этом классе! как объект класса, в котором и открывается подключение!
Меня удивляет почему в других потоках видны изменения сделанные в одном потеке.
Я могу как-то открыть независимые подключения из каждого потока?
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827390
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е., всё-таки, мысль о том, что у объекта бывает глобальное состояние - новая и оригинальная?
Ну тогда примите как данность, что или вы создаёте соединения "по месту" или используете пул. Собственный или готовую реализацию. В случае пула не вы управляете жизненным циклом подключения.
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827392
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Ну конкретно в этом случае ново...
Вопрос, тогда как правильно организовать работу. Только через пулы?
и еще вопрос, если я делаю commit(), то он также как и close() выполняется во всех потоках?
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827398
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работу можно организовывать по разному.
Можно через пул, можно через персональное соединение каждому потоку. Обычно, пул подходит "почти всегда" и хорошо масштабируется.
commit - меняет состояние данных в базе, а не состояние подключения к этой базе. close - наоборот, хотя, в качестве побочного эффекта, может влиять и на состояние данных.
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827404
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Так у меня собственно и вопрос в этом, как сделать независимые подключения в каждом потоке?

Нашел вот такой пример создания пула
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
class DBConnectionManager
{

    String databaseUrl = "jdbc:mysql://localhost:3306/myDatabase";
    String userName = "userName";
    String password = "userPass";

    Vector connectionPool = new Vector();

    public DBConnectionManager()
    {
        initialize();
    }

    public DBConnectionManager(
        //String databaseName,
        String databaseUrl,
        String userName,
        String password
        )
    {
        this.databaseUrl = databaseUrl;
        this.userName = userName;
        this.password = password;
        initialize();
    }

    private void initialize()
    {
        //Here we can initialize all the information that we need
        initializeConnectionPool();
    }

    private void initializeConnectionPool()
    {
        while(!checkIfConnectionPoolIsFull())
        {
            System.out.println("Connection Pool is NOT full. Proceeding with adding new connections");
            //Adding new connection instance until the pool is full
            connectionPool.addElement(createNewConnectionForPool());
        }
        System.out.println("Connection Pool is full.");
    }

    private synchronized boolean checkIfConnectionPoolIsFull()
    {
        final int MAX_POOL_SIZE = 5;

        //Check if the pool size
        if(connectionPool.size() < 5)
        {
            return false;
        }

        return true;
    }

    //Creating a connection
    private Connection createNewConnectionForPool()
    {
        Connection connection = null;

        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(databaseUrl, userName, password);
            System.out.println("Connection: "+connection);
        }
        catch(SQLException sqle)
        {
            System.err.println("SQLException: "+sqle);
            return null;
        }
        catch(ClassNotFoundException cnfe)
        {
            System.err.println("ClassNotFoundException: "+cnfe);
            return null;
        }

        return connection;
    }

    public synchronized Connection getConnectionFromPool()
    {
        Connection connection = null;

        //Check if there is a connection available. There are times when all the connections in the pool may be used up
        if(connectionPool.size() > 0)
        {
            connection = (Connection) connectionPool.firstElement();
            connectionPool.removeElementAt(0);
        }
        //Giving away the connection from the connection pool
        return connection;
    }

    public synchronized void returnConnectionToPool(Connection connection)
    {
        //Adding the connection from the client back to the connection pool
        connectionPool.addElement(connection);
    }

    public static void main(String args[])
    {
        DBConnectionManager dbConnectionManager = new DBConnectionManager();
    }

}



Вот только не пойму в чем разница, также создаются несколько подключений с помощью метода DriverManager.getConnection ну только в одном потоке... может в этом разница?
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827409
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"В одном потоке" это "в одном потоке":
Код: sql
1.
2.
3.
4.
5.
6.
7.
Подключение подключение;
try {
  подключение.Задать(параметры);
  подключение.Использовать(другие параметры);
}
catch (ЧегоНадо исключение) { обработать() }
finally { подключение.close(); }

Ну или более современное try-with-resource.

P.S. Ещё раз: состояние подключения - глобальное. Никак не привязано к потоку.
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827430
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Еще раз объясню, мне нужно создать независимые подключения для каждого потока - это возможно?
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827613
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jedditeBasil A. Sidorov,

Еще раз объясню, мне нужно создать независимые подключения для каждого потока - это возможно?Да, возможно.
Используйте встроенный механизм пула потоков соответствующего драйвера (если он есть). При использовании пула потоков (да и не только, а в многопоточных приложениях в особенности) общей рекомендацией является следующее: открывать соединение непосредственно перед обращением к БД, и закрывать сразу после него, освобождая тем самым ресурсы как клиента, так и сервера, т.е. не держать соединения открытыми слишком долго.
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827649
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeddite,

Используйте интерфейс javax.sql.DataSource и какую-нибудь opensource реализацию для него - BoneCP, Apache Commons DBCP, C3P0
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827650
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovДа, возможно.
Используйте встроенный механизм пула потоков соответствующего драйвера (если он есть).
Плохой совет в большинстве случаев.
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827683
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAlex KuznetsovДа, возможно.
Используйте встроенный механизм пула потоков соответствующего драйвера (если он есть).
Плохой совет в большинстве случаев.Коллега, обоснуйте свою точку зрения, пожалуйста.
Дабы потомкам было понимание...
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827690
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jedditeЕще раз объясню, мне нужно создать независимые подключения для каждого потока - это возможно?Для каждого потока вызовите DriverManager.getConnection().
...
Рейтинг: 0 / 0
Независимые подключения к бд MSSQL из разных потоков
    #38827693
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovКоллега, обоснуйте свою точку зрения, пожалуйста.
Дабы потомкам было понимание...
Внутри JDBC драйвера, обычно, нет нормального полноценного пула. Например в драйвере PostgreSQL в JavaDoc пула написано что не стоит его использовать.
И документации к драйверу SQL Server сказано
http://msdn.microsoft.com/en-us/library/ms378484(v=sql.110).aspx
Что DataSource там нужен только для интеграции с пулом JEE контейнера.

А в JTDS пула нет совсем
http://jtds.sourceforge.net/features.html
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Независимые подключения к бд MSSQL из разных потоков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]