Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未找到适合jdbc的驱动程序:postgresql://192.168.1.8:5432/NexentaSearch_Java_Linux_Postgresql_Jdbc_Driver - Fatal编程技术网

Java 未找到适合jdbc的驱动程序:postgresql://192.168.1.8:5432/NexentaSearch

Java 未找到适合jdbc的驱动程序:postgresql://192.168.1.8:5432/NexentaSearch,java,linux,postgresql,jdbc,driver,Java,Linux,Postgresql,Jdbc,Driver,我是按照java程序编写的 import java.io.*; import java.util.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; import java.util.*; pu

我是按照java程序编写的

import java.io.*;
import java.util.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.*;

public class Sample {
    public static void main (String[] args) throws IOException  {
                    int CountComputers;
            FileInputStream fstream = new FileInputStream(
                    "/export/hadoop-1.0.1/bin/countcomputers.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String result=br.readLine();
            CountComputers=Integer.parseInt(result);
            input.close();
            fstream.close();
            Connection con = null;
            Statement st = null;
                ResultSet rs = null;    
               String url = "jdbc:postgresql://192.168.1.8:5432/NexentaSearch";
                String user = "postgres";
                String password = "valter89";
            ArrayList<String> paths = new ArrayList<String>();
            try
            {
                con = DriverManager.getConnection(url, user, password);
                        st = con.createStatement();
                        rs = st.executeQuery("select path from tasks order by id");
                while (rs.next()) { paths.add(rs.getString(1)); };
                PrintWriter zzz = null;
                    try
                    {
                            zzz = new PrintWriter(new FileOutputStream("/export/hadoop-1.0.1/bin/readwaysfromdatabase.txt"));
                    }
                    catch(FileNotFoundException e)
                    {
                            System.out.println("Error");
                            System.exit(0);
                    }
                    for (int i=0; i<paths.size(); i++)
                {
                    zzz.println("paths[i]=" + paths.get(i) + "\n");
                    }
                    zzz.close();

            }
            catch (SQLException e) 
            {
                System.out.println("Connection Failed! Check output console");
                e.printStackTrace();
            }
        }
}
Jar具有以下清单文件

Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
Main-Class: Sample
Class-Path: /folder/postgresql-8.4-703.jdbc3.jar
还包含文件/folder/postgresql-8.4-703.jdbc3.jar。我通过命令启动了Sample.jar

./java -jar -Djava.library.path=/opt/jdk1.7.0_06/lib /Samplejavaprogram/Sample.jar
因此,我收到了以下信息

Connection Failed! Check output console
java.sql.SQLException: No suitable driver found for jdbc:postgresql://192.168.1.8:5432/NexentaSearch
    at java.sql.DriverManager.getConnection(DriverManager.java:604)
    at java.sql.DriverManager.getConnection(DriverManager.java:221)
    at org.myorg.Sample.main(Sample.java:33)
我从地址为192.168.1.10的主机启动了该文件,在主机192.168.1.8上它正常运行。
帮助消除错误。

您使用的是JDBC 3驱动程序。JDBC 4驱动程序是由
DriverManager
自动加载的,而JDBC 3驱动程序不是。因此,您需要调用

Class.forName("org.postgresql.Driver");
一旦进入应用程序,(在调用
DriverManager#getConnection
之前)



或者,您可以使用JDBC 4 PostgreSQL驱动程序,该驱动程序不需要上述方法调用。

只需使用jar命令提取应用程序与数据库服务器连接所需的文件。e、 jar-xfjdbc_文件。用javac-cp编译它。并使用java-cp运行它

就这样。它会工作的。

使用
DriverManager.registerDriver(新org.postgresql.Driver())

哪一行引发异常?你能给我看一下你的JAR吗?请不要使用DataInputStream来阅读文本,也请从你的示例中删除它,这个坏主意经常被复制。在Tomcat8上的JDBC 4中,我也遇到了这种情况,
DriverManager.registerDriver
方法通常只应由JDBC驱动程序调用(它们在加载类时调用)。应用程序代码不应该调用它(这个“规则”也有例外,但这些是非常罕见的)@MarkRotteveel谢谢你的评论。但你不能只说一些不应该使用的东西,而不提供任何理由或细节。至少有一个指向记录此内容的链接会有所帮助。引用的javadoc:“新加载的驱动程序类应调用方法registerDriver,以使DriverManager了解它自己。”这意味着它通常应由
驱动程序
实现调用。并且:“加载驱动程序类时,它应该创建自身的实例并向DriverManager注册。”我还建议阅读第9.2节,该节描述了驱动程序如何注册自己以及如何加载驱动程序。所有这些都清楚地表明,该方法不适合用户代码调用。Oracle文档中描述的内容将起作用,但它不是JDBC驱动程序的使用方式。它们可能是因为关于
Class.forName
的注释而被记录的。“然而,此方法仅对符合JDK的Java虚拟机有效。它对Microsoft Java虚拟机无效。”,这似乎可以追溯到90年代末,也就是2000年代初,当时Microsoft拥有自己的但并不总是兼容的Java变体。
Class.forName("org.postgresql.Driver");