내 프로그램에서 HikariCP를 구현하려고합니다.HIkariCP 구현시 ResultSetImpl 오류
public class ServerMain {
final static int nPort = 8888;
private HikariDataSource DS = null;
public static void main(String[] args) throws IOException {
new ServerMain();
}
public ServerMain(){
DS = dsInitiate();
try {
ServerSocket sSocket = new ServerSocket(nPort);
//Loop that runs server functions
while(true) {
//Wait for a client to connect
Socket socket = sSocket.accept();
socket.setSoTimeout(30000);
//Create a new custom thread to handle the connection
ClientThread cT = new ClientThread(socket, nPort);
//Start the thread!
new Thread(cT).start();
}
}
catch(IOException ex) {ex.printStackTrace();}
}
private static HikariDataSource dsInitiate(){
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(3);
config.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
config.addDataSourceProperty("databaseName", "XXX");
config.addDataSourceProperty("user", "XXX");
config.addDataSourceProperty("password", "XXX");
config.addDataSourceProperty("useSSL", "false");
HikariDataSource ds = new HikariDataSource(config);
return ds;
}}
이 클래스는 클라이언트 연결을 관리하고 각 클라이언트에 대해 새 스레드를 엽니 다 나는 메인 클래스가 있습니다.
class ClientThread implements Runnable{
public void run(){
/// some code .....
}
private byte[] getFile(LocalDateTime ldt) {
ldt = ldt.plusSeconds(17); // 17 leap seconds
ldt = ldt.minusSeconds(3*3600); // 3 hours between UTC and GPS time
try {
Connection conn = DS.getConnection();
CG.Generate(ldt, conn);
} catch (SQLException ex) {ex.printStackTrace();}
///// some code .....
}}
ClientThread 클래스 내에서 getFile
메소드를 호출, 연결이 DS
개체에서 차용 : 내 메인 클래스의 내부에서 나는 ClientThread 클래스가 있습니다. 이 연결은 변수로 CG
개체의 Generate
메서드로 전달됩니다. 연결 인스턴스가 문이 생성 된 MainDB
클래스로 전달되는 Generate
방법 내부
public class Corr_Gen{
//// some variable ....
public void Generate(LocalDateTime LDT, Connection conn){
MainDB DB = new MainDB();
DB.setConn(conn);
DB.createSTMT();
for (int sn = 1; sn < 33; sn++){
String Q = "SELECT IODE FROM Navigation WHERE SV = "+sn+" ORDER BY Date DESC;";
ResultSet rs = DB.execQuery(Q);
try {
if (rs.next()){
int tmp = rs.getInt(1); /// some code ....
}
} catch (SQLException ex) {ex.printStackTrace();}
}
DB.closeSTMT();
DB.closeConn();
}}
다음 CG
개체는 다음 클래스의 인스턴스입니다. 이 문을 사용하여 쿼리를 실행하려고합니다. 당신이 볼 수 있듯이, 내가 그것을 사용하여 끝나면 진술과 연결을 닫습니다.
문제는 내가 ClientThread
클래스에 대해 1 개 이상의 스레드를 실행하려고 할 때 결과 세트로 무언가를 시도하는 동안 오류가 발생합니다. 이것은 다음 오류입니다. Exception in thread "Thread-0" java.lang.NullPointerException at com.mysql.jdbc.ResultSetImpl.checkColumnBounds(ResultSetImpl.java:766) at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2477) at com.zaxxer.hikari.proxy.HikariResultSetProxy.getInt(HikariResultSetProxy.java) at dummyTest.Corr_Gen.Generate_v2(Corr_Gen.java:37) at Exo_Ntrip_Server.ServerMain$ClientThread.getFile(ServerMain.java:131) at Exo_Ntrip_Server.ServerMain$ClientThread.response(ServerMain.java:247) at Exo_Ntrip_Server.ServerMain$ClientThread.run(ServerMain.java:107) at java.lang.Thread.run(Thread.java:745)
이 오류는 두 개 이상의 스레드를 실행하는 경우에만 발생합니다.
내가 뭘 잘못하고 있니? 연결 풀을 잘못 사용하고 있습니까? 나는 무엇을 놓치고 있습니까? 도움을 주시면 감사하겠습니다.
"일부 코드"블록의 탐색 테이블을 업데이트하거나 삽입하고 있습니까? – MGorgon
아닙니다. 이 코드를 실행하면 미래에는 아마도 지금이 코드를 읽을 것입니다. –
IODE 컬럼이없는 resultSet이있는 것처럼 보입니다. 1에서 32까지의 SV 값에 대한 모든 쿼리가 IODE를 반환하는 것으로 확인 되었습니까? – MGorgon