JDBC: невозможно подключиться во второй раз - PullRequest
0 голосов
/ 06 декабря 2010

Привет всем Я пытаюсь подключить базу данных. ниже я дал код. Я могу подключиться к базе данных, но не могу подключиться во второй раз, если разница между 1-м и 2-м временем больше, чем «время ожидания» базы данных mysql Я использую базу данных MySQL. У меня проблема "сбой линии связи" wait_timeout 10 секунд (для удобства) это 8 часов для моей БД Я даю вам код

public class DatabaseManager {
 private static Connection jConn;
 private static DatabaseManager manager;

public Boolean getUser(){
  Statement jStmt = null;
  ResultSet rs = null;
  try {

   String query = "SELECT * FROM  USER  ";
    System.out.println(query);
   jStmt = jConn.createStatement();
   rs = jStmt.executeQuery(query);
   while (rs.next()) {

   }
  }catch (Exception e) {
   e.printStackTrace();
   return false;
  }
  return true;
 }

    public static synchronized DatabaseManager getInstance() {
  if (manager == null) {
   try {
    manager = initialize();
   } catch (DatabaseInitializationException e) {
    // e.printStackTrace();
    // throw new RuntimeException("Database Initialization
    // Exception");
   }
  }
  return manager;
 }
        private static DatabaseManager initialize()
   throws DatabaseInitializationException {

  try {
   Class.forName(serverSrv.readPropertyValue("Srver_Path",
     "DBdriver"));
  } catch (ClassNotFoundException e) {
   throw new DatabaseInitializationException(e.getMessage());
  }
  try {
   jConn = DriverManager.getConnection("DB_URL","user","password");
   System.out.println("Excecuted initialize() for Database ");
  } catch (SQLException e) {
   throw new DatabaseInitializationException(e.getMessage());
  }
  return new DatabaseManager();
 }
}

И я тестирую как

 public static void main(String[] args) {
  long st = System.currentTimeMillis();
  long end ;
  DatabaseManager dm = DatabaseManager.getInstance();

  if( dm.getUser() )
   System.out.println("success");
  else
   System.out.println("failed..");

  do{
   end = System.currentTimeMillis();
  }while( (end-st)<12*1000 );

  if( dm.getUser() )
   System.out.println("success");
  else
   System.out.println("failed..");
 }

и это дает исключение как

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

Last packet sent to the server was 0 ms ago.
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
 at java.lang.reflect.Constructor.newInstance(Unknown Source)
 at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
 at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2873)
 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2763)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3299)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1837)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1961)
 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2537)
 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2466)
 at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1383)
 at mypackage.db.DatabaseManager.getUser(DatabaseManager.java:127)
 at mypackage.test.Test.main(Test.java:23)
Caused by: java.net.SocketException: Software caused connection abort: recv failed
 at java.net.SocketInputStream.socketRead0(Native Method)
 at java.net.SocketInputStream.read(Unknown Source)
 at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
 at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
 at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
 at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2329)
 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2774)

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

Возможно, вам следует закрыть ResultSet, а также Statement.

Эта ссылка содержит несколько советов по правильному выполнению этого действия.

1 голос
/ 06 декабря 2010

Ваша проблема в том, что вы пытаетесь повторно использовать jConn , который автоматически закрывается по истечении времени ожидания. Поэтому, когда вы попытаетесь использовать его снова, выдается исключение. В зависимости от того, что вы пытаетесь сделать, я бы предложил (для простоты) ..

  1. Закрытие jConn путем ввода jConn.close ();
  2. Затем, когда вам нужно снова использовать БД, снова подключитесь с помощью jConn = DriverManager.getConnection ("DB_URL", "user", "password");
0 голосов
/ 06 декабря 2010

Проверьте настройки времени ожидания подключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...