连接池中没有合适的驱动程序异常

Posted

技术标签:

【中文标题】连接池中没有合适的驱动程序异常【英文标题】:no suitable driver exception in connection pooling 【发布时间】:2016-04-09 08:20:03 【问题描述】:

我正在尝试使用 servlet 实现连接池。我知道有很多类似的问题被问过,但没有一个能够提供帮助。

这里是例外:

java.sql.SQLException:无法为连接 URL null 创建类的 JDBC 驱动程序 org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2160) 在 org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2032) 在 org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1532) 在 连接.CityInfoServlet.showCityInformation(CityInfoServlet.java:104) 在 connection.CityInfoServlet.doGet(CityInfoServlet.java:76) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source) 引起: java.sql.SQLException:没有合适的驱动程序 java.sql.DriverManager.getDriver(Unknown Source) 在 org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2144) ... 27 更多

我不知道为什么会出现这个异常:

原因:java.sql.SQLException:没有合适的驱动程序。

我在 WEB-INF/lib 文件夹中添加了 jar 文件。

这是我的 Servlet 代码:

package connection;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

@WebServlet("/CityInfoServlet")
public class CityInfoServlet extends HttpServlet 
private static final long serialVersionUID = 1L;

DataSource dataSource = null;

public void init( ServletConfig config ) 
    try  
        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup("java:/comp/env");
        dataSource = (DataSource) envContext.lookup("jdbc/worldDB");
    
    catch( Exception exe )
    
        exe.printStackTrace();
    


public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException
    response.setContentType("text/html");

    PrintWriter out = response.getWriter();
    String title = "City Information From mysql Database";
    out.print("<html><body bgcolor=\"#f0f0f0\">");
    out.print("<h1 align=\"center\">" + title + "</h1>\n");
    showCityInformation(out);

    out.print("</body></html>");


private void showCityInformation( PrintWriter out )

    Connection connection = null;
    PreparedStatement preparedStatement = null;
    try 

        String sql = "select * from city limit ?";
        connection = dataSource.getConnection();

        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, 10);

        ResultSet rs = preparedStatement.executeQuery();

        while( rs.next() )
        
            int id = rs.getInt(1);
            String name = rs.getString(2);
            String countryCode = rs.getString(3);
            String district = rs.getString(4);
            int population = rs.getInt(5);

            out.print("ID: " + id + "<br>");
            out.print("Name: " + name+ "<br>");
            out.print("CountryCode: " + countryCode+ "<br>");
            out.print("District: " + district+ "<br>");
            out.println("Population: " + population+ "<br>");
            out.println("--------------------------------------"+ "<br>");
        

        rs.close();

    

    catch( Exception e )
    
        e.printStackTrace();
    
    finally
    
        try 
            if( preparedStatement != null ) 
                preparedStatement.close();
            
        
        catch( SQLException sqlException )
            sqlException.printStackTrace();
        
        try
        
            if( connection != null )
            
                connection.close();
            
        
        catch( SQLException sqlException )
        
            sqlException.printStackTrace();
        
    
  

这是 context.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/worldDB" auth="Container" type="javax.sql.DataSource"
    maxTotal="100" maxIdle="30" maxWaitMillis="10000"
    username="root" password="12345" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/world"/>
</Context>

【问题讨论】:

是的,我完全从我的实际数据中复制了它。 @RadLexus 资源上下文有什么问题? @RadLexus 那是错字。我很抱歉@RadLexus 【参考方案1】:
Cannot create JDBC driver of class for connect URL null

连接的 URL 未设置,因此 JDBC 库无法确定要加载的驱动程序。

【讨论】:

在 context.xml 中添加 URL 没关系;如果在运行时 URL 为空,则为空。如果您希望它不为空,那么您只是缩小了分辨率的搜索空间。【参考方案2】:

我认为..

1 - 您必须将合适的驱动程序复制到 Server/lib 文件夹

2 - 如果你必须在你的项目 META-INF 上创建 DataSource Connection context.xml 然后修改

3 - 你的项目的 WEB.xml 像这样(添加这个)

<resource-ref>
    <description>MySQLDatasource</description>
    <res-ref-name>jdbc/worldDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

然后你可以运行这个应用程序http://localhost:8080/app_name - 好的 但是如果你想从http://localhost:8080调用这个应用程序

那么你必须

1 - 将 Context 标签添加到您的 Server/conf/server.xml 文件中

2 - 将此行添加到您的 Server/conf/context.xml

 <Resource name="jdbc/worldDB" auth="Container" type="javax.sql.DataSource"
    maxTotal="100" maxIdle="30" maxWaitMillis="10000"
    username="root" password="12345" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/world"/>

3 - 重启服务器

然后它将从服务器上下文中找到此连接。

【讨论】:

以上是关于连接池中没有合适的驱动程序异常的主要内容,如果未能解决你的问题,请参考以下文章

Glassfish RAR5035:从池中销毁资源时出现意外异常

jTDS - 运行 Maven 构建项目时没有合适的驱动程序异常

SQL 异常:在 Android Studio 中使用 MS JDBC 时没有合适的驱动程序

线程“main”java.sql.SQLException 中的异常:运行 spark-submit 时没有合适的驱动程序

Jooq 事务:如果事务中抛出异常,则连接不会释放到池中

Java并发程序设计线程池之异常终止和正常关闭