#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)); этогде он выдает ошибку> я не знаю, как исправить эту ошибку.