JDBC是Java里边一个很重要的组成部分,现代的很多软件应用,都和数据库相关,因此,JDBC起着日益重要的作用。即便一个Java开发工程师不怎么直接使用JDBC,而是使用ORM等框架,但是这些框架也是给予JDBC包装而来的。因此,JDBC的不足,也给这些ORM还有数据库连接池组件带来了很大的不便。
我们知道,Java的Statement(和PreparedStatement),在execute查询和执行语句时,都需要检查SQLException,这个SQLException实际上表示的涵义太宽泛了,这也就是我在题目中提到的“缺乏设计”,实际上,一个Statement,执行的时候出错,有着多种可能,应该把这些错误分一下类来设计,这样表示的更清楚。
比如。在Statement去执行一个SQL时,很有可能是其所依赖的Connection被关闭了,这个时候,执行语句跑出的SQLException实际上是不合适的,应该是SQLConnectionException;
比如,要去一个不存在的表中select,执行时,跑出SQLException实际上是很对的;
但是我们看到,不管JDBC的版本怎么提升,从来也没有出现过SQLConnectionException这种东西,不管SQL执行时除了什么错,都是SQLExceptin。这非常像当初刚刚学Java时,写一个接口,通通声明为抛出Exception....
(后来看了,SQLException有一些子类,但是这些子类,都是所,执行某个SQL时的错误,按照道理,都应该是数据库连接正常,但是SQL有问题,例如查询不存在的表等操作,而SQLConnectionException不应该是SQLException的子类)
那么这个问题会影响到什么呢?如果每次使用都是直接创建连接,使用并且关闭还好,遇到异常就关闭就完事了,但是我们知道,目前很多开发使用的都是连接池,池化连接的close不是真正的关闭,而是将连接送回池中。
例如代码为:
Connection conn = null; try{ conn = pool.getConnection(); conn..... }catch(Exception ex){ ... }finally{ if(conn!=null)conn.close(); }
问题在于,如果出现异常了(一般是SQLException),应该怎么处理?按照逻辑,应该是如果是SQL查了一个不存在的表之类的,当然是连接回池,如果是连接坏了,当然是直接关闭。
但是现在我们能判断吗?因为只有SQLException,我们判断不出来。
根据SQLException的Message判断吗?不同数据库,Message是不同的。。。
还有可恨的,大多数数据库连接池,实际上是不向外提供“真正关闭一个连接”这个操作时,当然,这么做的考虑是为了屏蔽池化连接和直接创建的连接的区别,但是,这个接口封上之后,面对的这种问题应该怎么处理呢?
目前。大多数连接池也有一种办法解决,就是配置一个SQL,每次取出一个连接用的时候,都先执行一下,如果出错,表示连接坏了,连接池(连接池自身当然能够真正关闭连接)真正关闭这个连接,给一个新的连接供外部请求者使用。但这是个拙劣的方法,因为一个SQL意味着和数据库的一个TCP交互,性能的损耗是客观存在的,高并发、高效率的系统不应该用这种方法。
如果JDBC能够区分,那么将省去了很多麻烦,不管在连接池内部处理还是外部处理,至少都是符合逻辑的。在这里也建议使用一些开源数据库连接池组件的朋友们,如果你要选择一种连接池,一定注意这种连接池这种情况下的处理,是怎样设计实现的,这一是表明了开发者考虑问题是否周全,而是关乎系统效率和稳定性。
可能有的朋友会问,Java不会这么缺乏好的设计吗?我其实也不希望Java有这种缺陷,希望有一种好的机制来解决我的问题,但是很可惜没有看到。之前曾经花了很大的力气研究Java的源码,曾经认为Java有很多地方值得学习,所以去研读。结果发现,有很多代码非常好,同时也发现很多代码很糟糕;甚至不是实现代码的问题,而是设计时粗枝大叶。没有想清楚使用者使用中的问题。
一时、一天细心容易做到,但是在职业生涯中总保持细心、周全的考虑问题并不是件容易的事情,所以虽然觉得这里有问题,但是也不是嘲讽或者责难别人,而是希望Java早一天认识到这些基础库的问题,对这些东西进行一些梳理和改进,做好基础语言,别盲目的追逐热点,把高楼大厦建立在沙滩上。
相关推荐
Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...
本资源"03-数据库连接池驱动"包含了三种常用的数据库连接池驱动:C3P0、Druid和DBCP,它们都是为了优化数据库连接管理和复用而设计的。 首先,C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3...
总结来说,JDBC数据库连接池是提高Java应用程序数据库操作效率的关键技术。理解其工作原理,选择合适的连接池组件,并进行合理配置和优化,能够显著提升系统的性能和稳定性。在实际项目中,开发者应根据业务需求和...
**JDBC数据库连接池工程文件详解** 在Java开发中,JDBC(Java Database Connectivity)是用于与各种数据库交互的标准API。然而,频繁地创建和关闭数据库连接会消耗大量的系统资源,影响应用程序性能。为了解决这个...
综上所述,Durid数据库连接池提供了一套完整的解决方案,从连接池管理到SQL执行监控,使得开发者能够高效、稳定地操作数据库。在实际项目中,可以根据需求调整配置,利用Durid的特性提升系统的性能。
数据库连接池的基本工作原理是:当应用程序需要访问数据库时,首先从连接池中获取一个已经建立好的连接,使用完毕后,不是立即关闭连接,而是将其归还给连接池,以便其他请求再次使用。这样避免了频繁地打开和关闭...
数据库连接池是一种对象池设计模式的应用,它维护了一组数据库连接,供多个应用程序共享。通过复用已建立的连接,避免了频繁创建和销毁连接带来的开销,从而提升了系统性能。数据库连接池还提供了诸如连接管理和资源...
本文将详细解析“数据库连接池——JDBC通过代理模式来保持用户关闭连接的习惯”这一主题,并以`MyConnectionHandler.java`作为示例代码进行讲解。 首先,我们需要了解数据库连接池的基本概念。数据库连接池,又称为...
### JDBC技术和数据库连接池专题 #### 一、JDBC基础知识...总结来说,JDBC技术为Java应用程序提供了统一访问数据库的能力,而数据库连接池进一步优化了数据库访问性能,是构建高效稳定的企业级应用不可或缺的部分。
在JSP应用中,自定义数据库连接池通常涉及到以下关键知识点: 1. **连接池配置**:包括设置初始连接数、最大连接数、最小连接数、超时时间等参数,以平衡资源占用与性能需求。 2. **连接对象的生命周期管理**:当...
数据库连接池是现代数据库应用程序中的重要组成部分,它有效地管理和优化了数据库连接的创建、分配和回收,从而提高系统的性能和资源利用率。本压缩包包含了几个常见的数据库连接池驱动包,这些驱动包为开发者提供了...
数据库连接池是数据库管理中的重要组成部分,它在提高应用程序性能和资源管理方面起着关键作用。连接池的基本原理是预先创建一定数量的数据库连接,并将它们保存在一个池中,当应用需要连接数据库时,不再直接建立新...
综上所述,这个资源提供了带有注释的通用JDBC数据库连接池实现,对于初学者和经验丰富的开发者来说都是很好的学习和实践素材,可以帮助他们更好地理解和管理数据库连接,提高应用程序的性能和稳定性。
2. **HikariCP** 是目前性能最优的数据库连接池,它的设计目标是低延迟和高吞吐量。HikariCP的配置相对简单,通过HikariConfig类设置参数,然后通过HikariDataSource类实例化连接池。 3. **Apache DBCP** 是Apache...
【标题】:“基于JDBC的数据库连接池技术研究与应用” 【描述】:本文主要探讨了在Java环境中,如何利用JDBC和数据库连接池技术来优化Web应用程序对数据库的访问,以提高系统性能和资源利用率。 【标签】:JDBC, ...
数据库连接池是Java应用程序中非常重要的一个组成部分,它在处理多用户并发访问数据库时能显著提高性能和资源利用率。在给定的标题“自己写的数据库连接池(java)”中,我们可以推测这是一个用户自定义的数据库连接池...
数据库连接池是现代软件开发中不可或缺的一个重要组件,它的主要作用是提高数据库访问效率,减少系统资源消耗。本文将深入探讨数据库连接池的应用与研究,包括其原理、优点、常见实现以及如何在实际项目中有效地利用...
总的来说,理解并实现一个简单的数据库连接池可以帮助我们更好地理解和利用这一技术,同时也能锻炼我们的多线程编程和设计能力。在实际项目中,结合maven和其他开源库,我们可以构建出高效、可靠的数据库连接管理...