Один и тот же список входных данных для двух разных запросов в sql server с использованием метода java db

#java #sql-server-2008

#java #sql-server-2008

Вопрос:

Я хочу установить единое соединение с sql server для двух разных запросов, имеющих одинаковые входные данные. Это достижимо? Вот мой код, который дважды установит соединение с базой данных для выполнения отдельных запросов с одним и тем же вводом.

    String query1="select ID_Student,Lib_Sec_Book from Library_db1  where ID_Student";

   String query2="select ID_Student,Lib_Sec_Book from Library_db2  where ID_Student";

   Map<String, String> result1=dba.dbcon(inputListMismatch,query1);
   Map<String, String> result2=dba.dbcon(inputListMismatch,query2);
 

эти запросы имеют одинаковые идентификаторы учащихся в качестве входных данных, мне нужно выяснить, какой идентификатор имеет книгу из двух библиотечных баз данных.Это может быть взаимоисключающим.

сохранение результирующего набора запросов query1 и query2 в result1 и result2 соответственно, два результата должны быть в одной карте. В методе dba,

 Map<String, String> result=new HashMap<String,String>();

try {
 String databaseDriver = "net.sourceforge.jtds.jdbc.Driver";
 Class.forName(databaseDriver);
} 
catch (Exception e) {
 e.printStackTrace();
}


try 
{
 String url = "jdbc:jtds:sqlserver://server;instance=";

 java.sql.Connection con =DriverManager.getConnection(url);

 System.out.println("Connection created");
 String sqlQuery=query " " getIn(list.size());

 PreparedStatement preparedStatement = con.prepareStatement(sqlQuery);

 for(int i=0; i<list.size(); i  )
  preparedStatement.setString(i 1, (String) list.get(i));

 ResultSet rs = preparedStatement.executeQuery();
 ResultSetMetaData rsMeta=rs.getMetaData();
 int colcount=rsMeta.getColumnCount();
 result.put(rsMeta.getColumnName(1),rsMeta.getColumnName(2));

 while(rs.next())
 {
  result.put(rs.getString(1),rs.getString(2));
 }

 rs.close();
 preparedStatement.close();
 con.close();
} 
catch (Exception e1) 
{
 e1.printStackTrace();
}
 return resu<
}
 

получение списка входных данных

      static String getIn(int numParams) {
    StringBuilder builder = new StringBuilder("IN (?");
    for(int i=1; i<numParams; i  )
        builder.append(",?");
    builder.append(")");
    return builder.toString();
}
 

Теперь я получаю два разных результирующих набора, я хочу передать два запроса в одном экземпляре.
Я попробовал объединение, оно выдает ошибку «Параметр не установлен».
и я также пробовал ‘allowMultiQueries = TRUE», что не помогает.
Можете ли вы предложить лучший способ сделать это?

Ответ №1:

Я не уверен, чего вы хотите, но я пытаюсь дать вам несколько предложений.

Если вы ищете решение для повышения производительности, используйте два потока для одновременного запроса. Используйте http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html для управления потоками.

Если вы хотите объединить два запроса в один запрос, попробуйте следующий код для построения sql.

 String sqlQuery=query " " getIn(list1.size())  " union "  getIn(list2.size());
PreparedStatement preparedStatement = con.prepareStatement(sqlQuery);

for(int i=0; i<list1.size(); i  )
   preparedStatement.setString(i 1, (String) list.get(i));

for(int i=0; i<list2.size(); i  )
   preparedStatement.setString(list1.size() i 1, (String) list.get(i));
 

Комментарии:

1. Спасибо вам за ваш вклад.. Я получаю сообщение об ошибке «Параметр #(list.size() 1) не был установлен»

2. Я использовал строку запроса SqlQuery=query1 » » getIn(list.size()) » объединение » query2 » » getIn(list.size());

3. Вы тестировали с использованием строки sql с жестким кодом? Например, строка SqlQuery=query » in(?,?,?) union » query2 » in(?,?,?)», а затем для (int i=0; i<6; i ) PreparedStatement.setString(list1.size() i 1, «1»);

4. Я проверил, указав значения, я получил исключение «Недопустимый параметр index #(list.size() 1).

5. Завтра я проведу для вас несколько экспериментов. Я найду его для вас.

Ответ №2:

Я протестировал следующий код с использованием базы данных DB2, и я думаю, что он будет хорошо работать с другими базами данных. Потому что jdbc позаботится о том, чтобы его API подходили для разных баз данных.

     String urlRemote = "jdbc:db2://fake_ip_address:60004/fake_db_instance_name";//远程方式连接DB2的默认端口为6789
    String strJDBCRemote = "com.ibm.db2.jcc.DB2Driver";
    String userName = "fake_user";
    String password = "fake_password";
    Class.forName(strJDBCRemote);

     //连接远程时必须要有用户名和密码,否则连接时报错
    Connection con = DriverManager.getConnection(urlRemote,userName,password);
    String sql = "select id,value  from fake_table1 where id=?  union select member_number as id,dbindx_number as value from fake_table2";
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.setString(1,"1");
    ResultSet rs = pstmt.executeQuery();
    while(rs.next()){
      System.out.println(rs.getString(1) "  " rs.getString(2));  
    }
    con.close();
 

Комментарии:

1. Привет, спасибо .. Я попробовал приведенный выше код, который выдает ошибку «Параметр #(list.size() 1) не установлен», для одной записи он работает, для списка он не работает pstmt.setString(i 1,list.get(i)); этогде он выдает ошибку> я не знаю, как исправить эту ошибку.