1

Вопрос по java, jdbc, informix – сообщить JDBC застрял подключение

Я пытаюсь подключиться к серверу базы данных Informix с помощью jdbc стандартным способом:

connection = DriverManager.getConnection("jdbc:informix-sqli://"+ip+
/"+sid+":INFORMIXSERVER="+server+";user="+user+";password="+pass+"");

Но он продолжает пытаться подключиться и не выдает сообщение об ошибке (я полагаю, он пытается подключиться, потому что ничего не показывает). Я использую драйвер IBM Informix 4.10.00.1534 и Java 1.7. Я использовал этот метод для подключения к серверам Informix до сих пор, на самом деле он не работает только с одним сервером. Я могу подключиться к этому серверу через клиенты Informix с помощью odbc, но он продолжает работать с jdbc без сообщения об ошибке.

Есть ли какой-нибудь метод для подробного описания соединения jdbc? Любое предложение о том, почему это не удается?

ОБНОВЛЕНИЕ: трассировка sqlidebug:

C->S (4)            
    SQ_VERSION
    SQ_EOT

S->C (14)           
    SQ_VERSION
        "7.31.TD6" [8]
    SQ_EOT

C->S (66)           
    SQ_INFO
        INFO_ENV
            Name Length = 12
            Value Length = 8
            "DBTIME"="%d/%M/%Y"
            "DBTEMP"="/tmp"
            "SUBQCACHESZ"="10"
        INFO_DONE
    SQ_EOT

S->C (2)            
    SQ_EOT

C->S (16)           
    SQ_DBOPEN
         "database" [8]
        NOT EXCLUSIVE
    SQ_EOT

S->C (28)           
    SQ_DONE
        Warning..: 0x15
        # rows...: 0
        rowid....: 0
    serial id: 0
SQ_COST
    estimated #rows: 1
    estimated I/O..: 1
SQ_EOT

C->S (78)           
    SQ_PREPARE
        # values: 0
        CMD.....: "select site from informix.systables where tabname = '   GL_COLLATE'" [65]
    SQ_NDESCRIBE
    SQ_WANTDONE
    SQ_EOT

И jdbctrace.log говорит:

 trying com.informix.jdbc.IfxDriver
    SQLWarning: reason(Database selected) SQLState(01I04)
    SQLWarning: reason(Float to decimal conversion has been used) SQLState(01I05)
    SQLWarning: reason(Database has transactions) SQLState(01I01)
    SQLWarning: reason(Database selected) SQLState(01I04)
    SQLWarning: reason(Database has transactions) SQLState(01I01)
    SQLWarning: reason(Database selected) SQLState(01I04)
6 ответов
0

Попробуйте запустить код

который подключается к базе данных Informix, но также показывает полную информацию об исключениях и создает файлы трассировки. Один файл трассировки для JDBC, один для Informix. Измените URL на базу данных, имя пользователя и пароль и запустите его. Вы, вероятно, увидите проблему на экране или в файле трассировки:

import java.io.FileWriter;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

class informix_trace
    {
    public static void main(String[] args)
        {
        try
            {
            Class.forName("com.informix.jdbc.IfxDriver");
            FileWriter fwTrace = new FileWriter("c:\\JDBCTrace.log");
            PrintWriter pwTrace = new PrintWriter(fwTrace);
            DriverManager.setLogWriter(pwTrace);
            String debug_url = "SQLIDEBUG=C:\\sqlidebug.trace";
            String url = "jdbc:informix-sqli://1.2.3.4:9088/test_db:informixserver=ol_testifx;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250;" + debug_url
            Connection connection = DriverManager.getConnection(url, "user", "passwd");
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT FIRST 1 DBINFO('version','full') FROM systables;");
            while (resultSet.next())
                System.out.println(resultSet.getObject(1));
            }
        catch (Exception e)
            {
            e.printStackTrace();
            }
        }

    } // class informix_trace

Файл трассировки Informix будет с некоторым постфиксом (временная метка или аналогичная информация), и в моем случае это было что-то вродеsqlidebug.trace1391758523500.0, Это двоичный файл, но вы можете проанализировать его, используяsqliprt полезность.

Пример моего сеанса с неверным именем базы данных:

c:\>sqliprt  sqlidebug.trace1391758523500.0
SQLIDBG Version 1
    ...
S->C (12)
                SQ_ERR
                                SQL error..........: -329
                                ISAM/RSAM error....: -111
                                Offset in statement: 0
                                Error message......: "" [0]
                SQ_EOT

ВJDBCTrace.log Я могу найти более интересную информацию (я вижу это также на моем экране):

SQLState(IX000) vendor code(-111)
java.sql.SQLException: ISAM error: no record found.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3412)
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2324)
    ....
    at java.sql.DriverManager.getConnection(Unknown Source)
    at informix_trace.main(informix_trace.java:20)
getConnection failed: java.sql.SQLException: No database found or wrong system privileges.

(Я перевел это с польского, так что это может немного отличаться)

Я попробовал предложенные вами отладочные операторы, и он не завершил печать файла отладки, в определенный момент он завис и не продолжал печатать. Я обновил ответ с результатами. еще раз спасибо

от xacy
0

Мое предложение состоит в том, чтобы:

построить ConnectString и показать нам его полный контент, так мы увидим, если вip есть только IP-адрес или если он с номером порта

вместо добавления имени пользователя и пароля в ConnectString используйте версию с 3 параметрамиgetConnection() как:

getConnection("jdbc:informix-sqli://169.0.5.10:9088/test_db:informixserver=ol_test;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250", username, password)

(конечно, установите мой собственный язык вместо моего польского языка)

Для отслеживания сетевого трафика используйте такие инструменты, как Wireshark. Начните захватывать IP-трафик в вашу базу данных Informix. В моем случае правило Wireshark:

ip.addr == 169.0.5.10

Если я настрою неправильно, IP Wireshark будет отображать «Пункт назначения недоступен».

Вы также можете увидеть что-то, используя netstat:

c:\>netstat -an | grep 9088
    TCP    169.0.1.126:4295       169.0.5.10:9088        TIME_WAIT

Это было, когда мое приложение перестало работать.

В случае ошибки (неправильный порт IP) я вижу:

c:\>netstat -an | grep 9089
    TCP    169.0.1.126:4398       169.0.5.10:9089        SYN_SENT

Я попробовал ваше предложение о 3-х параметрической версииgetConnection() и netstat (я не могу установить wireshark здесь). Версия с 3-мя параметрами не меняет ничего, она продолжает пытаться соединиться и не возвращает код ошибки (собранный URL соответствует стандарту ip: port), а собранная информация netstat говорит только о том, что соединение установлено с сервером. но, похоже, не отвечает. Большое спасибо за уделенное время.

от xacy
0

IBM

Говорит, что: From version 3.00.JC1 of ® Informix® JDBC Driver onwards, debug drivers are no longer shipped. Informix JDBC Driver now supports SQLIDEBUG. You no longer need to set values for TRACE, TRACEFILE or PROTOCOLTRACE, PROTOCOLTRACEFILE. You only need to set SQLIDEBUG. и страница переходит к описанию шагов, необходимых для создания трассировки. Копирование:

Установите для CLASSPATH пакет драйвера JDBC Informix.

c: \ Infx \ Java> set CLASSPATH = C: \ infx \ JDBC3.00JC3 \ lib \ ifxjdbc.jar; C: \ infx \ JDBC3.00JC3 \ lib \ ifxjdbcx.jar ;.

Скомпилировать simple.java

c: \ Infx \ Java> javac simple.java

Убедитесь, что SQLIDEBUG установлен правильно

c: \ Infx \ Java> grep SQLIDEBUG simple.java
conn = DriverManager.getConnection ("jdbc: informix-sqli: // irk: 1526 / sysmaster: INFORMIXSERVER = irk940; USER = informix; ПАРОЛЬ = ximrofni; SQLIDEBUG = C: \ infx \ java \ trace");

Примечание. SQLIDEBUG устанавливается в строке подключения. Это указывает на то, где файл трассировки будет найден в определенном формате, т.е. trace.xxxxxxx

Удалить или переместить все остальные файлы трассировки

c: \ Infx \ Java> del trace *

Запустите java.simple

c: \ Infx \ Java> java простые systables syscolumns ... ... oledbordinals

Затем найдите файл трассировки

c: \ Infx \ Java> dir trace * Том на диске C не имеет метки. Серийный номер тома B823-46D8

Каталог c: \ Infx \ Java

04.04.2006 14:12 20 560 trace1144156355642.0 1 Файл (ов) 20 560 байт 0 Dir (ы) 4 067 995 648 байт свободно

C: \ Infx \ Java>

Вы сможете увидеть, что файл трассировки был создан, однако вы не сможете прочитать файл.

Отправьте файл трассировки в местный офис технической поддержки для анализа.

Конечно, если вы не используете версию 3.00.JC1 драйверов Informix, проигнорируйте вышеизложенное иследуйте другому набору инструкций; еще раз продублирован для вашего удобства:

Чтобы включить трассировку, укажите переменные среды TRACE, TRACEFILE, PROTOCOLTRACE и PROTOCOLTRACEFILE в URL-адресе базы данных или в списке свойств при установке соединения с базой данных Informix или сервером базы данных. TRACE может быть установлен на один из следующих уровней:

Трассировка не включена. Это значение по умолчанию.Отслеживает точки входа и выхода из методов.То же, что и на уровне 1, а также отслеживаются общие сообщения об ошибках.То же, что и на уровне 2, плюс переменные данных также отслеживаются. TRACEFILE Указывает полный путь к файлу операционной системы на клиентском компьютере, на который записываются сообщения TRACE.

PROTOCOLTRACE отслеживает сообщения протокола SQLI, отправленные между вашей программой Java и сервером базы данных Informix.

Могут быть установлены следующие уровни:

Трассировка протокола не включена. Это значение по умолчанию.Отслеживает идентификаторы сообщений.То же, что и на уровне 1, а также отслеживаются данные в пакетах сообщений. PROTOCOLTRACFILE указывает полный путь к файлу операционной системы на клиентском компьютере, на который записываются сообщения PROTOCOLTRACE.

надеюсь, это поможет

0

Code:

попробуйте другую версию JDBCпроверятьNETTYPE параметр конфигурации и сравнить его с текущим количеством сеансов informixвыводить состояние потока Java (kill -3) при зависании соединения jdbc
0

Для получения дополнительной информации просмотрите [эту книгу] (

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.informix.*;
public class DBConnect {
    static String url="jdbc:informix-sqli://host_name:port/database_name:INFORMIXSERVER=server;user=username;password=password";

    public static void main(String [] args){
        try {
            Class.forName("com.informix.jdbc.IfxDriver");
        }catch (Exception e){
            System.out.println("ERROR: failed to load Informix JDBC driver.");
            e.printStackTrace();
            return;
        }
        try{

            DriverManager.registerDriver((com.informix.jdbc.IfxDriver)Class.forName("com.informix.jdbc.IfxDriver").newInstance());

        }catch(Exception ex){
            System.out.println("Driver is not Registered");
        }
        try{

            Connection conn = DriverManager.getConnection(url);
            System.out.println("Connection Successful");
        }catch (SQLException e){
            System.out.println("ERROR: failed to connect!");
            System.out.println("ERROR: " + e.getMessage());
            e.printStackTrace();
            return;
        }
        }
}

http://www.cursor-distribution.de/aktuell.11.70.xC6/documentation/ids_jdbc_bookmap.pdf)

0

Проблема

с которой я столкнулся, заключалась в том, что Informix прослушивал локальный адрес IPv6 на порту 7360, командаnetstat -a отображал этот формат:

TCP    [feab::11ab:78ab:efab:8aab%17]:7360  myhostname:0      LISTENING

Поэтому мое соединение jdbc всегда прерывалось до тех пор, пока я не понял, что должен использовать IPv6-адрес в URL:

jdbc:informix-sqli://fe80::1125:78c0:ef17:8ab5%17:7360:user=informix;password=test;INFORMIXSERVER=ol_informix1210_2

Вы можете проверить, что соединение работает с помощью этого простого скрипта:

/***************************************************************************
 *
 *  Title:         SimpleConnection.java
 *
 *  Description:    Demo a connection to a server (no database specified)
 *      
 *  An example of running the program: 
 *      
 *   java SimpleConnection 
 *      'jdbc:informix-sqli://myhost:1533:user=<username>;password=<password>'
 *      
 *   Expected result:
 * 
 * >>>Simple Connection test.
 * URL = "jdbc:informix-sqli://myhost:1533:user=<username>;password=<password>"
 * >>>End of Simple Connection test.
 * 
 ***************************************************************************
 */

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class SimpleConnection {

    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("FAILED: connection URL must be provided in order to run the demo!");
            return;
        }

        String url = args[0];

        String testName = "Simple Connection";

        Connection conn = null;

        System.out.println(">>>" + testName + " test.");
        System.out.println("URL = \"" + url + "\"");

        try {
            Class.forName("com.informix.jdbc.IfxDriver");
        } catch (Exception e) {
            System.out.println("FAILED: failed to load Informix JDBC driver.");
        }

        try {
            PrintWriter out = new PrintWriter(System.out, true);
            DriverManager.setLogWriter(out);
            conn = DriverManager.getConnection(url);
        } catch (SQLException e) {
            System.out.println("FAILED: failed to connect!");
        }

        try {
            conn.close();
        } catch (SQLException e) {
            System.out.println("FAILED: failed to close the connection!");
        }

        System.out.println(">>>End of " + testName + " test.");
    }
}

Похожие вопросы