【问题标题】:Connection between Java program and mariadb won't work if it is executed via jsch [duplicate]如果通过jsch执行Java程序和mariadb之间的连接将不起作用[重复]
【发布时间】:2021-12-27 22:27:26
【问题描述】:

因此,我尝试通过我电脑上的 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();
            
          


                
            
        }
    }```

【问题讨论】:

  • "如果我尝试通过另一个带有 jsch 的 java 程序执行该程序..." 另一个使用 jsch 的程序的代码在哪里?当您的代码到达getConnection() 行时会发生什么?你说它停止工作,但实际发生了什么?您是否收到错误消息或异常?错误说明了什么?
  • 您好,添加了代码,第二点是我的问题。我没有收到任何消息或异常。我知道在那一行发生了一些事情的唯一原因是,我在该行之后放置了一个 System.out.println("1")System.out.println("2"),并且只得到了 1 作为终端输出。
  • 没听说过 plink,试试看。新行不在我的程序中,不知道为什么stackoverflow会这样显示。
  • 我尝试通过 ssh 脚本连接另一个 pi,现在我收到消息:没有找到适合 jdbc:mariadb 的驱动程序....所以它不会使用.bashrc 的类路径?这可以解释为什么它不起作用

标签: java mariadb jsch


【解决方案1】:

所以 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 脚本,现在一切正常。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2019-02-01
    • 2018-02-05
    • 2022-12-25
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多