如果通过 jsch 执行,Java 程序和 mariadb 之间的连接将不起作用
Connection between Java program and mariadb won't work if it is executed via jsch
所以我尝试从我电脑上的 visual studio 代码通过 jsch 在 raspberryPi 上启动一个 Java 程序。该程序连接到 mariadb 数据库并执行简单的 Select 语句。
如果我通过 putty 登录到 raspberryPi,java 程序和 mariadb 之间的连接工作正常。如果我尝试通过另一个带有 jsch 的 java 程序执行该程序,该程序将启动但不会执行行 connection = verbindung_datenbank.getConnection(dbURL, user, password);
我放置了一些 System.out.println();
行来查找程序停止工作的行。在这条线之前它起作用了,在那之后它没有。
我不明白的是,为什么如果我通过 putty 登录程序可以运行,但如果程序通过 SSH 登录则不能运行?
这里是完整代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.io.*;
import java.sql.*;
public class connection_db {
public static Connection getConnection(String dbURL, String user, String password) throws SQLException {
Connection connection = DriverManager.getConnection(dbURL, user, password);
connection.setAutoCommit(true);
return connection;
}
public static void main(String[] args) {
Connection connection = null;
Integer aId=null;
String dbURL = "jdbc:mariadb://192.168.178.39:3306/temperature";
String user = "pi";
String password = "test";
try {
connection = verbindung_datenbank.getConnection(dbURL, user, password);
String query = "SELECT MAX(id) FROM table1" ;
System.out.println(query);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
while(rs.next())
{
Integer id = rs.getInt("MAX(id)");
System.out.println(id);
aId = id;
}
double temperature = -15;
String query2 = "UPDATE table1 SET theke_1 = "+temperature +" WHERE id = "+ aId;
System.out.println(query2);
Statement stmt2 = connection.createStatement();
stmt2.executeQuery(query2);
stmt2.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// connection.close();
}
}
}
希望有人能帮助我。
编辑:
来自 jsch 程序的代码:
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
public class main_slave {
public static void main(String[] args) throws JSchException, InterruptedException, IOException{
String host = "192.168.178.46";
String user = "pi";
String password = "password";
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setUserInfo(new main_slaveUserInfo(user, password));
session.connect();
Channel channel = session.openChannel("exec");
InputStream in = channel.getInputStream();
((ChannelExec) channel).setCommand("java
connection_db");
channel.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
channel.disconnect();
session.disconnect();
}
}```
所以 Martin Prikryl 的提示是正确的。 Jsch 使用不同的 bash 文件,因此我的程序无法运行。
我的解决方案:我编写了一个小 bash 脚本:
#!/bin/bash
export CLASSPATH=/home/pi/Documents/Java/mariadb-java-client-2.7.3.jar:.
java connection_db
然后我将执行命令从 java connection_db 更改为 bash 脚本,现在一切正常。
所以我尝试从我电脑上的 visual studio 代码通过 jsch 在 raspberryPi 上启动一个 Java 程序。该程序连接到 mariadb 数据库并执行简单的 Select 语句。
如果我通过 putty 登录到 raspberryPi,java 程序和 mariadb 之间的连接工作正常。如果我尝试通过另一个带有 jsch 的 java 程序执行该程序,该程序将启动但不会执行行 connection = verbindung_datenbank.getConnection(dbURL, user, password);
我放置了一些 System.out.println();
行来查找程序停止工作的行。在这条线之前它起作用了,在那之后它没有。
我不明白的是,为什么如果我通过 putty 登录程序可以运行,但如果程序通过 SSH 登录则不能运行?
这里是完整代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.io.*;
import java.sql.*;
public class connection_db {
public static Connection getConnection(String dbURL, String user, String password) throws SQLException {
Connection connection = DriverManager.getConnection(dbURL, user, password);
connection.setAutoCommit(true);
return connection;
}
public static void main(String[] args) {
Connection connection = null;
Integer aId=null;
String dbURL = "jdbc:mariadb://192.168.178.39:3306/temperature";
String user = "pi";
String password = "test";
try {
connection = verbindung_datenbank.getConnection(dbURL, user, password);
String query = "SELECT MAX(id) FROM table1" ;
System.out.println(query);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
while(rs.next())
{
Integer id = rs.getInt("MAX(id)");
System.out.println(id);
aId = id;
}
double temperature = -15;
String query2 = "UPDATE table1 SET theke_1 = "+temperature +" WHERE id = "+ aId;
System.out.println(query2);
Statement stmt2 = connection.createStatement();
stmt2.executeQuery(query2);
stmt2.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// connection.close();
}
}
}
希望有人能帮助我。
编辑: 来自 jsch 程序的代码:
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
public class main_slave {
public static void main(String[] args) throws JSchException, InterruptedException, IOException{
String host = "192.168.178.46";
String user = "pi";
String password = "password";
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setUserInfo(new main_slaveUserInfo(user, password));
session.connect();
Channel channel = session.openChannel("exec");
InputStream in = channel.getInputStream();
((ChannelExec) channel).setCommand("java
connection_db");
channel.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
channel.disconnect();
session.disconnect();
}
}```
所以 Martin Prikryl 的提示是正确的。 Jsch 使用不同的 bash 文件,因此我的程序无法运行。 我的解决方案:我编写了一个小 bash 脚本:
#!/bin/bash
export CLASSPATH=/home/pi/Documents/Java/mariadb-java-client-2.7.3.jar:.
java connection_db
然后我将执行命令从 java connection_db 更改为 bash 脚本,现在一切正常。