2014-08-13 4 views
1

Я использую драйвер JTDS для связи с SQL Server, и у меня возникают проблемы с управлением потерей соединения. Я не могу проверить, удалено ли соединение. Я буду подробно моя проблема:Подключение SQL Server с использованием JDBC - JTDS

Это мой метод, который создает соединение:

public synchronized Connection NewConnection (ConnectionParameters params) { 
     try { 
      String url = ""; 
      if (params.getTipoBanco(). equals ("MySQL")) { 
       if (! mySqlDriverLoaded) 
        return null; 
       url = "jdbc:mysql://"+params.getIpServidor()+":"+params.getPorta()+"/"+params.getNomeBanco()+"?user="+params.getUsuario()+"&password="+params.getSenha(); 
      } else if (params.getTipoBanco(). equals ("SQL Server")) { 
       if (! sqlServerDriverLoaded) 
        return null; 
       url = "jdbc:jtds:sqlserver://"+params.getIpServidor()+":"+params.getPorta()+"/"+params.getNomeBanco()+";user="+params.getUsuario()+";password="+params.getSenha(); 
      } else { 
       throw new IllegalArgumentException("Type of database invalid data"); 
      } 
      return DriverManager.getConnection(url); 
     } Catch (Exception e) { 
      e.printStackTrace(); 
      message = "Error in connection:" + e.getMessage(); 
      return null; 
     } 
    } 

Если сервер отсутствует в создании подключения, вы можете проверить, потому что SQLException будет брошен. Проблема заключается в падении связи после того, как она успешно выполняется:

Connection connSqlserver = ConnectionFactory.getInstance().newConnection(paramSqlserver); 
PreparedStatement stSqlServer = connSqlserver.prepareStatement("select * from operator"); 
ResultSet rsSqlserver = stSqlserver.executeQuery(); 

Если соединение обрывается до или во время ExecuteQuery(), приложение блокируется в методе ожидающего соединения обратно. Никакое исключение не выбрасывается.

Я пытался использовать следующие средства для проверки падения соединения:

DriverManager.setLoginTimeout(x); 
statement.setQueryTimeout(x); 

3 loginTimeout = х параметров в строке подключения

Ни один из них не получил успеха.

Если вы можете дать мне несколько рекомендаций, будем благодарны.

Спасибо!

ответ

1

FYI, LoginTimeout устанавливает, сколько времени вы ждете, чтобы установить соединение. После подключения он не влияет. Похоже, диск jTDS реализует socketTimeout, который, я думаю, должен покрыть ваше состояние. Они также реализуют socketKeepAlive. Я не знаком с тем, как они реализуют его, но я предполагаю, что опрос, связанный с тем, чтобы поддерживать его открытым, и \ или возвращать исключение, если оно было удалено. Я не думаю, что jTDS предлагает это, но некоторые функции переключения отказа могут быть полезны. Вот краткое изложение одной реализации: ow.ly/AhpTZ

+0

Спасибо! Я поместил «socketTimeout = 5» в строку подключения, и он работает правильно для меня! –

+0

Отлично. Я рад, что это помогло. – BruceRudd

Смежные вопросы