`

JDBC .MySQLNonTransientConnectionException异常的几点思考

 
阅读更多

一、JDBC简介        

 

        JDBCJava Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。

二、实例

package org.hj.util.jdbc;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * JDBC工具类:关闭流和取得连接
 * @author DingJie
 * @date 2014-5-3
 * @email dingjie_nlp@126.com
 */
public final class JdbcUtil {
	
	private static String driver;
	private static String url;
	private static String user;
	private static String password;
	private static Connection conn;
	//静态块:加载文件
	static{
		Properties props = new Properties();									
		InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("org/hj/config/jdbc/db.properties");
		try {
			props.load(is);
		} catch (Exception e) {
			e.printStackTrace();
		}
		driver = props.getProperty("driver");
		url = props.getProperty("url");
		user = props.getProperty("user");
		password = props.getProperty("password");
	}
	
	//静态块:注册驱动
	static{
		try {
			Class.forName(driver);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 每个线程获取一个唯一jdbc连接
	 * @return
	 */
	public static Connection getMySqlConnection() {
		
		if(conn == null) {
			synchronized (JdbcUtil.class) {
				if(conn == null) {
					try {
						conn = DriverManager.getConnection(url,user,password);
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}
		}
		return conn;
	}
	/**
	 * 关闭结果集
	 * @param rs
	 */
	public static void close(ResultSet rs){
		if(rs!=null){
			try {
				rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 * 关闭SQL语句声明
	 * @param stmt
	 */
	public static void close(Statement stmt){
		if(stmt!=null){
			try {
				stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 * 关闭数据库连接
	 * @param conn
	 */
	public static void close(Connection conn){
		if(conn!=null){
			try {
				conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

这里有两个连续的Dao操作:

public List<TreeType> listAllTreeType(){
		List<TreeType> list = new ArrayList<TreeType>();
		Connection conn = JdbcUtil.getMySqlConnection();
		Statement stmt = null;
		ResultSet rs = null;
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery("SELECT id, tree_name FROM tree_type");
			while(rs.next()) {
				TreeType tt = new TreeType();
				tt.setId(rs.getInt("id"));
				tt.setTreeType(rs.getString("tree_name"));
				list.add(tt);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(rs != null) {
				JdbcUtil.close(rs);
			} 
			if(stmt != null) {
				JdbcUtil.close(stmt);
			}
			/*if(conn != null) {
				JdbcUtil.close(conn);
			}*/
		}
		return list;
	}

	/**
	 * 通过名称查找所有的树种
	 * @param treeName
	 * @return
	 */
	public List<TreeType> findTreeByName(String treeName) {
		List<TreeType> list = new ArrayList<TreeType>();
		Connection conn = JdbcUtil.getMySqlConnection();
		
		Statement stmt = null;
		ResultSet rs = null;
		try {
			stmt = conn.createStatement();

			rs = stmt.executeQuery("SELECT id, tree_zone FROM tree_type where tree_name='"+treeName+"'");
			while(rs.next()) {
				TreeType tt = new TreeType();
				tt.setId(rs.getInt("id"));
				tt.setTreeType(rs.getString("tree_zone"));

				list.add(tt);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(rs != null) {
				JdbcUtil.close(rs);
			} 
			if(stmt != null) {
				JdbcUtil.close(stmt);
			}
			if(conn != null) {
				JdbcUtil.close(conn);
                                conn = null;
			}
		}
		return list;
	}

 上述两段代码都有JdbcUtil.close()的操作,但是连续执行两段代码时会抛出

 使用如下sql命令查看当前活动连接:

Threads_connected:表示当前打开连接的线程数;

Threads_created:表示当前创建的线程数; 

Threads_running:表示当前尚未睡眠的线程;

   出现上述异常是因为,conn是单例的,但是在进行第二次数据库操作 findTreeByName时数据库已经关闭了,所以将第一个方法JdbcUtil.close(conn)注释掉。在执行第最后一次数据库操作时在关闭。

   这里需要好好设计一下究竟在什么时候关闭数据库,一般而言是可以在entity,dao,service层中写可以分别打开分别关闭。为了和数据库事物操作保持一致可以在服务层打开和关闭。

   因此这里要么不关闭,要么显示的关闭,并同时设置conn为空,但这样单例也就失去了部分意义,因为每次JdbcUtil.getConnection()都是需要new对象,但是可以保证每次只有一个conn存在。所以需要综合考虑数据库操作的情况来进行。

  

 

 

  • 大小: 16.8 KB
  • 大小: 8.3 KB
分享到:
评论

相关推荐

    解决Cause com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

    Cause com.mysql.jdbc.exceptions.jdbc4.CommunicationsException The last packet successfully received from the server was 47,795,922 milliseconds ago. The last packet sent successfully to the server was...

    sun.jdbc.odbc.JdbcOdbcDriver.zip

    标题中的"sun.jdbc.odbc.JdbcOdbcDriver.zip"是一个包含Java数据库连接(JDBC)驱动的压缩包,主要用于在Java应用程序中通过ODBC(Open Database Connectivity)接口访问各种数据库。这个驱动,也称为JDBC-ODBC桥,...

    com.microsoft.sqlserver.jdbc.SQLServerDriver

    标题“com.microsoft.sqlserver.jdbc.SQLServerDriver”涉及的是微软SQL Server数据库与Java应用程序之间的连接驱动。这个驱动程序是Java Database Connectivity (JDBC)的一部分,允许Java开发者通过编写Java代码来...

    sun.jdbc.odbc.jdbcodbcdriver-Maven.zip

    标题中的"sun.jdbc.odbc.jdbcodbcdriver"指的是Java数据库连接(JDBC)中的一个特定驱动,即JDBC-ODBC桥接驱动。这个驱动在早期的Java版本中被广泛使用,它允许Java应用程序通过ODBC(Open Database Connectivity)...

    sun.jdbc.odbc.JdbcOdbcDriver.jar.7z

    jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver,解决办法!因为jdk1.8环境不支持sun.jdbc.odbc.JdbcOdbcDriver驱动,所以这里为特别为您提供一个解决JDK1.8不...

    Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: ….. this is incompatible with sq

    1、写在开头 标题之前我想说一下Linux的mysql真的实在是太坑了。太坑了。总是会出现这样那样的你想不到的问题。崩溃了。首先来罗列一下我遇到过的...Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExcepti

    数据库 gaussbd jdbc com.huawei.gauss.jdbc.ZenithDriver-1.2.1.jar

    com.huawei.gauss.jdbc.ZenithDriver-1.2.1.jar

    hana jdbc ngdbc.jar com.sap.db.jdbc.Driver

    标题 "hana jdbc ngdbc.jar com.sap.db.jdbc.Driver" 指的是 SAP HANA 数据库的 JDBC 驱动程序,其核心组件是一个名为 `ngdbc.jar` 的 Java 类库。这个驱动程序允许 Java 应用程序通过 JDBC(Java Database ...

    华为数据库 gaussdb jdbc com.huawei.gauss.jdbc.ZenithDriver-1.1.0.jar

    华为数据库 gaussdb jdbc包com.huawei.gauss.jdbc.ZenithDriver-1.1.0.jar

    sun.jdbc.odbc.JdbcOdbcDriver.jar

    jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver,解决办法!因为jdk1.8环境不支持sun.jdbc.odbc.JdbcOdbcDriver驱动,所以这里为特别为您提供一个解决JDK1.8不...

    sun.jdbc.odbc.jdbcodbcdriver驱动包

    jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver, 原因:从jdk从1.8开始,删除了jdbc-odbc桥,所以odbc的驱动是用不了的 解决方法:提供一个解决JDK1.8不能连接...

    mysql 异常com.mysql.jdbc.CommunicationsException

    本次异常的具体描述为:“Communications link failure due to underlying exception: **BEGINNESTED EXCEPTION** java.io.EOFException STACK TRACE: java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully...

    com.mysql.jdbc.Driver驱动包工具

    com.mysql.jdbc.Driver驱动包

    sun.jdbc.odbc.JdbcOdbcDriver下载

    jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver, 原因:从jdk从1.8开始,删除了jdbc-odbc桥,所以odbc的驱动是用不了的 解决方法:这里为提供一个解决JDK1.8不...

    Cannot load JDBC driver class 'com.microsoft.sqlserver.jdbc.SQLServerDriver'

    标题 "Cannot load JDBC driver class '...总之,"Cannot load JDBC driver class 'com.microsoft.sqlserver.jdbc.SQLServerDriver'" 是一个常见的编程问题,通过排查上述几个方面,通常能找出问题所在并解决。

    DmJdbcDriver,达梦数据库maven版本,dm.jdbc.driver.DmDriver

    标题中的"DmJdbcDriver"指的是达梦数据库提供的Java JDBC驱动程序,全称为"dm.jdbc.driver.DmDriver"。JDBC(Java Database Connectivity)是Java编程语言与各种数据库进行交互的一种标准接口,而DmDriver是达梦...

    sun.jdbc.rowset的jar包

    sun.jdbc.rowset的jar包,2000年的老包。不过有些老项目需要。 包括sun.jdbc.rowset.CachedRowSet。

    weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 类型转换解决办法

    这种情况下,如果应用程序代码直接尝试将 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 转换成 `oracle.sql.CLOB`,则会抛出类型转换异常。为了解决这一问题,我们需要采用一种方法来安全地实现这两种类型的相互...

    com.mysql.cj.jdbc.Driver.zip

    在本压缩包"com.mysql.cj.jdbc.Driver.zip"中,包含两个核心文件:`mysql-connector-java-8.0.27.jar`和`mysql-connector-java-8.0.27.zip`。这两个文件都是MySQL官方发布的JDBC驱动程序,版本为8.0.27,适用于与...

    jtds驱动包 net.sourceforge.jtds.jdbc.Driver

    《jtds驱动包 net.sourceforge.jtds.jdbc.Driver详解》 在Java编程中,数据库连接是不可或缺的一部分。当涉及到与Microsoft SQL Server或Sybase数据库进行交互时,`jtds`驱动包扮演了至关重要的角色。`...

Global site tag (gtag.js) - Google Analytics