多くの人が経験したエラーは、次のメッセージに関連しています。
[Warning] Aborted connection 38 to db: 'database_name' user:
'root' host: 'localhost' (Got an error reading communication packets)
これは MySQL ログにあります。私の場合、データベースは、ドライバーとよく知られている C3P0 プールを使用して Java クライアントを介してローカルにアクセスされます。com.mysql.jdbc.Driver私の MySQL サーバーは非常に多くの接続を受け入れるように構成されており、max_allowed_packet の値は 64M に設定されています。my.cnf ファイル (MySQL 構成) からの抜粋を次に示します。
[mysqld]
max_allowed_packet = 64M
thread_concurrency = 8
thread_cache_size = 8
thread_stack = 192K
query_cache_size = 0
query_cache_type = 0
max_connections = 1024
back_log = 50
innodb_thread_concurrency = 6
innodb_lock_wait_timeout = 120
log_warnings
と
[mysqldump]
quick
quote-names
max_allowed_packet = 64M
私のデータベースのテーブルUserには、次の単純な構造があります。
CREATE TABLE `User` (
`uid` varchar(255) COLLATE utf8_bin NOT NULL,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`mail` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`password` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`maxParallelTasks` tinyint(4) NOT NULL DEFAULT '10',
`maxModels` int(11) NOT NULL DEFAULT '2000',
`maxBibTeX` int(11) NOT NULL DEFAULT '2000',
PRIMARY KEY (`uid`) USING BTREE,
UNIQUE KEY `mail` (`mail`) USING BTREE,
KEY `uid` (`uid`) USING BTREE,
KEY `index_user_name` (`name`) USING BTREE,
KEY `index_user_mail` (`mail`) USING BTREE,
KEY `index_user_maxModels` (`maxModels`) USING BTREE,
KEY `index_user_maxBibTeX` (`maxBibTeX`) USING BTREE,
KEY `index_user_maxParallelTasks` (`maxParallelTasks`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
mysqlクライアントを使用してそのテーブルの値を取得するとINSERT(つまりmysql -u root -p)、ログに警告が表示されません。ただし、同じ Java 側を試すと、前述の警告がログに何度も表示されます。したがって、Java 側では、私の接続は次のように構成された C3P0 接続プールから引き出されます。
datasource = new ComboPooledDataSource();
datasource.setJdbcUrl(connectURI);
datasource.setMaxPoolSize(1000);
datasource.setMinPoolSize(20);
datasource.setInitialPoolSize(50);
datasource.setNumHelperThreads(6);
datasource.setTestConnectionOnCheckin(true);
datasource.setTestConnectionOnCheckout(true);
ステートメントは最初に準備されます。
PreparedStatement ps = connection.prepareStatement(getSql());
次にパラメータ化します:
ps.setString(1, user.getUid());
ps.setString(2, user.getName());
ps.setString(3, user.getMail());
ps.setString(4, user.getHashedPass());
そして実行しました:
int update = ps.executeUpdate();
次に、準備されたステートメントを閉じます。
ps.close();
SQL 接続が閉じられます。
if (connection != null) {
try {
if (!connection.isClosed()) {
connection.close();
}
} catch (SQLException ex) {
throw new DbException(ex);
}
}
全体的な手順は (私には) 合法であるように思われます。http://dev.mysql.com/doc/refman/5.0/en/communication-errors.htmlの MySQL マニュアルによると、この警告は次のことを意味している可能性があります。
クライアント プログラムは、終了する前に mysql_close() を呼び出しませんでした。
またはその:
クライアント プログラムは、データ転送の途中で突然終了しました。
私のアプリケーションの目的のために、C3P0 を使用して、200 以上の並列スレッドを使用してこのデータベースに書き込みおよび読み取りを行いました。データが実際にデータベースに転送され、データベースから正常に取得されることを確認している間、メモリ リークはありません。他の誰かが同様の経験をしていますか?
最後に、MySQL のバージョンと、トラブルシューティングに役立つその他の情報を含めます。
mysql> show variables like "%version%";
+-------------------------+-------------------+
| Variable_name | Value |
+-------------------------+-------------------+
| protocol_version | 10 |
| version | 5.1.37-1ubuntu5.5 |
| version_comment | (Ubuntu) |
| version_compile_machine | x86_64 |
| version_compile_os | debian-linux-gnu |
+-------------------------+-------------------+
と
Java version: 1.6.0_22, (build 1.6.0_22-b04)