Я пытаюсь использовать библиотеку C3P0 для обработки пула соединений. Это мои настройки C3P0:
minPoolSize=3
maxPoolSize=20
acquireIncrement=1
maxIdleTime=240
maxStatements=20
В журнале я вижу, что C3P0, кажется, правильно инициализирован чтением
INFO com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool...
Но когда я пытаюсь это посмотреть, сколько соединений есть на моем MySQL db с
SHOW STATUS WHERE 'variable_name' = 'Threads_connected'
Я вижу, что результат 48, 46, 49 ecc.
Я не могу понять, если не правильно, как я пытаюсь понять, сколько соединений существует на db, или я не понял, как работает C3P0
Я также столкнулся с такой путаницей в MySQL для потоков и соединений. Я объясню, что я узнал и понял, изучая то же самое, если что-то, что я неправильно понял или все еще в замешательстве, пожалуйста, сделайте меня правильным.
Некоторые основы MySQL:
- MySQL server is a single process application.
- It is multithreaded.
- It accepts connections like TCP/IP server.
- Each connection gets a thread.
- These threads are sometimes named processes, and sometimes they're referred to as connections.
Последняя и вторая последняя точка делает так много путаницы. По нашему мнению, мы считаем, что существует 1-1 сопоставление между соединениями и активными потоками. Это правда также, но тогда есть пул потоков, что означает, что могут быть потоки, которые не связаны ни с каким соединением.
Каждое новое соединение получает свой собственный поток. Каждое новое соединение создает новый поток, а отключение вызывает уничтожение потока. Таким образом, существует 1-1 сопоставление между соединениями и активными потоками. После уничтожения потоков он может попасть в пул потоков. Таким образом, количество потоков больше или равно количеству подключений.
Также, если вы выполняете запрос ниже
SELECT t.PROCESSLIST_ID,IF (NAME = 'thread/sql/event_scheduler','event_scheduler',t.PROCESSLIST_USER) PROCESSLIST_USER,t.PROCESSLIST_HOST,t.PROCESSLIST_DB,t.PROCESSLIST_COMMAND,t.PROCESSLIST_TIME,t.PROCESSLIST_STATE,t.THREAD_ID,t.TYPE,t.NAME,t.PARENT_THREAD_ID,t.INSTRUMENTED,t.PROCESSLIST_INFO,a.ATTR_VALUE FROM performance_schema.threads t LEFT OUTER JOIN performance_schema.session_connect_attrs a ON t.processlist_id = a.processlist_id AND (a.attr_name IS NULL OR a.attr_name = 'program_name') WHERE 1=1
После этого вы увидите столбец TYPE
в том, что значения либо на FOREGROUND
или BACKGROUND
, так это говорит может быть некоторые темы, которые связаны с БД, чтобы сделать некоторые (фон) работы (например, поток событий, монитор резьбы и т.д.).
Как правило, c3p0 относится к соединению, а не к потокам, поэтому вы должны проверить SHOW FULL PROCESSLIST
для соединений с сервером БД.
Надеюсь, я очистил путаницу, с которой вы сталкиваетесь с потоками и соединениями MySQL.