Archive for MySQL


MySQLでコネクションが切れる問題

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

 そういえばJDBCで長時間放置しているとコネクションが切れる問題を解決したのをスッカリ忘れていました。

MySQLは8時間通信が無いと、コネクションを切るそうなのですが、JDBCの設定でAutoReconnect=trueを設定しておけば問題無いハズなのですが、今回はなぜかAutoReconnect=trueの設定をしても再接続されずに3日ほどドツボにハマッておりましたが、結局プログラムで例外をキャッチしてリトライさせる方法で解決しました。


JDBCのコネクションが切れる

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

 最近作成したプログラムで、一晩放置するとなぜか、コネクションが切れるという問題が発生。サーバを構築したのが私ではないので、どこか設定に問題があるのだろうが、ちと調査が大変だ。

解決方法

— Check the SQL Statement (preparation failed).
— Cause: java.sql.SQLException: No operations allowed after connection closed.Connection
was implicitly closed due to underlying exception/error:

** BEGIN NESTED EXCEPTION **

com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.io.EOFException

STACKTRACE:

java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1905)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2351)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2862)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2988)
at com.mysql.jdbc.Connection.rollbackNoChecks(Connection.java:4837)
at com.mysql.jdbc.Connection.rollback(Connection.java:4734)
at com.ibatis.common.jdbc.SimpleDataSource.popConnection(SimpleDataSource.java:629)
at com.ibatis.common.jdbc.SimpleDataSource.getConnection(SimpleDataSource.java:222)
at com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransaction.init(JdbcTransaction.java:48)
at com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:89)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:565)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:540)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:84)
at com.ibatis.dao.client.template.SqlMapDaoTemplate.queryForObject(SqlMapDaoTemplate.java:223)
at com.soba_project.webapi.registration.sqlmapdao.TrialInterimUserInfoSqlMapDao.getUserInfoByEmail(TrialInterimUserInfoSqlMapDao.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.ibatis.dao.engine.impl.DaoProxy.invoke(DaoProxy.java:72)
at $Proxy10.getUserInfoByEmail(Unknown Source)
at com.soba_project.webapi.registration.service.TrialInterimRegistrationService.getUserInfoByEmail(TrialInterimRegistrationService.java:55)
at com.soba_project.webapi.InterimRegistrationServlet.servletTrialInterimRegistration(InterimRegistrationServlet.java:412)
at com.soba_project.webapi.InterimRegistrationServlet.doGet(InterimRegistrationServlet.java:138)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)

** END NESTED EXCEPTION **

Last packet sent to the server was 1 ms ago.

STACKTRACE:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

autoReconnectForPools

http://dev.mysql.com/doc/refman/5.1/ja/connector-j-reference-configuration-properties.html


MySQLのレプリケーション

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

 世の中にあるデータベースの多くにはレプリケーションと呼ばれる、負荷分散の仕組みが備わっています。

 オープンソースのMySQLにも、この機能が備わっており、コストを掛けずに負荷分散をする事ができます。

◆レプリケーションの設定方法◆

 レプリケーションの設定は、それほど難しいものではありません。過去にMySQLを利用した事があれば、簡単に設定することができます。

1.すべてのMySQLサーバ上で、レプリケーション用のアカウントを作成します。

mysql> GRANT AREPLICATION SLABE, REPLICATION CLIENT ON *.* TO replication@”192.168.1.0/255.255.255.0″ IDENTIFIED BY ‘PASSWORD’;

2.すべてのサーバのmy.cnfに下記の設定を記述します。

[mysqld]セクションに下記の行を追加する。log-binは、log-bin=/var/・・・でパスとファイル名を指定できます。

log-bin
server-id=1

—–
スレーブ側の設定は下記の通りです。

server-id=2
master-host=master.test.com
master-user=replication
master-password=password
master-port=3306

3.マスターを再起動して、バイナリログが作成された事を確認します。

4.スレーブを再起動して、レプリケーションが働いていることを確認します。

ログファイルを参照すると、レプリケーションを開始した旨のログが出力されています。