1

タイトルで述べたように、MySQL サーバーへの JDBC 接続は、約 10 ~ 20 分の非アクティブ状態の後に失敗します。次のコードを使用してデータベースに接続します。

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.swing.*;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;

public class MyDB
{
    public Connection connect = null;
    public Statement statement = null;
    public PreparedStatement preparedStatement = null;
    public ResultSet resultSet = null;

    public void readDatabase() throws Exception
    {
        JSch jsch = new JSch();
        String host = "ssh.binero.se";
        String user = "username";
        Session session = jsch.getSession(user, host, 22);
        int lport = 1234;
        String rhost = "Ip_to_host";
        int rport = 3306;
        UserInfo ui = new MyUserInfo();
        session.setUserInfo(ui);
        session.connect();

        int assigned_port = session.setPortForwardingL(lport, rhost, rport);
        System.out.println("localhost:" + assigned_port + " -> " + rhost + ":" + rport);
        Class.forName("com.mysql.jdbc.Driver");
        connect = DriverManager
            .getConnection("jdbc:mysql://localhost:1234/database?
            user=user&password=pass&connectTimeout=28800000");

これは問題なく動作しますが、約 10 ~ 20 分間非アクティブ状態が続くと、データベース接続を使用しようとすると次のエラー メッセージが表示されます。

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 6 810 583 milliseconds ago.
The last packet sent successfully to the server was 6 810 800 milliseconds ago.

...

Caused by: java.net.SocketException: Software caused connection abort: socket write error

クエリのたびにデータベースから切断することでこれを解決できることはわかっていますが、そうしないことを好みます。また、一定時間経過するとデータベースから切断されるので、タイムアウトかと思いました。ただし、変数を変更したときに役立つ変数は見つかりませんでした。

4

1 に答える 1

-2
       Class.forName("com.mysql.jdbc.Driver");
       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Table_Name","root","");

これを試してみてください。タイムアウトしたことはありません。幸運を...!

于 2012-07-11T10:18:13.277 に答える