如果通过 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 脚本,现在一切正常。