Java 未找到适合jdbc的驱动程序:postgresql://192.168.1.8:5432/NexentaSearch
我是按照java程序编写的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
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");