单例模式的connection问题

首先看一篇文章:Java 代码优化过程的实例介绍

这篇文章的针对数据库连接的优化部分就是使用static connection对象,使得一个jvm中,所有的JdbcUtil对象共用一个connection。很多人都用这种方式来连接数据库,这种共用static connection效率确实很高,但是也有很多不确认因素。

  1. 并发问题,比如有A、B同时操作数据库,那么connection对象只有一个,会导致很多不可预知的问题。具体会导致什么样的结果,我也没研究过,网上资料也没有找到会具体导致什么问题。
  2. 事务问题,比如有A、B线程都是手动提交事务,在A线程执行到一半的时候,B线程把事务提交了,就会把A线程的东西一起提交,这样就有问题了。

所以如果你的项目中有很多并发需要使用到数据库,就需要用连接池。如果没有并发,并且没有事务,也可以用static connection,不过不建议,因为既然没有并发没有事务,为什么不直接new新的连接呢??记得用完connection之后关掉就好!

下面是两篇文章讨论static connection的问题

数据库连接池到底有什么用?一个静态的Connection对象不也可以让多个线程共享吗?

是否整个网站只有一个static静态数据库连接,效率将会提高?

时间: 2024-10-10 06:07:23

单例模式的connection问题的相关文章

JDBC+分页--【DRP】

JDBC package com.bjpowernode.drp.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.ResultSet; //JDBC工具类 public class DbUtil { /* *采用单例模式 取得Connection * @r

DRP视频总结

这个视频是一遍做项目一遍看的,因为时间管理并没有应用的很好,因此,这个在时隔几个月之后才将这个视频看完,对自己也是无语了.好了,废话不多说了,下面是我对DRP做的一个整理. 从图中,我觉得我整理并不好,在全局上,并不是一个完整的项目,只是对项目中比较重点介绍的知识点进行总结的,比如:数据库设计.Orcal的介绍,Html语言的介绍.servlet,jsp介绍.MVC框架的介绍等等.当然,里面还是有很多的东西,很重要的没有放进去. 作为一个项目来讲,我们第一开始首先要考虑的就是这个项目用到的框架,

ThreadLocal类使用说明

ThreadLocal类用于创建一个线程本地变量 在Thread中有一个成员变量ThreadLocals,该变量的类型是ThreadLocalMap,也就是一个Map,它的键是threadLocal,值为就是变量的副本.通过ThreadLocal的get()方法可以获取该线程变量的本地副本,在get方法之前要先set,否则就要重写initialValue()方法. ThreadLocal的使用场景: 数据库连接:在多线程中,如果使用懒汉式的单例模式创建Connection对象,由于该对象是共享的

获取JDBC Connection单例模式

package Base; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; //不可被继承的工具类 public final class JdbcUtilsSingleton { //私有化成员变量,防止影响其他类共有的变量 private  String ur

Java 单例模式探讨

以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. 总结一下我所知道的单例模式实现方式: 1.预先加载法 Java代码 class S1 { private S1() { System.out.println("ok1"); } private static S1 instance = new S1(); public static S1

经典的单例模式c3p0来控制数据库连接池

package com.c3p0.datapools; //数据库连接池  单例模式 import java.sql.Connection; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; import com.mchange.v2.c3p0.DataSources; public final class ConnectionManager { private static Conne

hibernate将connection放进threadlocal里实现数据库连接池

Why ThreadLocal? 无论如何,要编写一个多线程安全(Thread-safe)的程序是困难的,为了让线程共享资源,必须小心地对共享资源进行同步,同步带来一定的效能延迟,而另一方面,在处理同步的时候,又要注意对象的锁定与释放,避免产生死结,种种因素都使得编写多线程程序变得困难. 尝试从另一个角度来思考多线程共享资源的问题,既然共享资源这么困难,那么就干脆不要共享,何不为每个线程创造一个资源的复本.将每一个线程存取数据的行为加以隔离,实现的方法就是给予每个线程一个特定空间来保管该线程所独

设计模式(六):单例模式

一.概述 单例模式确保一个类只有一个实例,并提供一个安全的访问点. 二.解决问题 从概述中我们知道,单例模式就是保证系统的一个类只有一个实例.它的作用就是控制受限资源的访问,确保任何时刻都只有一个线程在访问一个受保护的资源.或者确保行为和状态的一致性,避免异常行为.在java web的程序中可能用到最多单例的地方就是jdbc的线程池. 三.结构类图 四.成员角色 实例变量(uniqueInstance):持有唯一的单例实例,静态私有访问权限,只有本类才能访问该实例变量. 全局访问方法(getIn

设计模式培训之一:为什么要用单例模式?

我们在编程中最常用的模式就是单例模式了,然而单例模式都用在什么场合?为什么不用静态方法而要用单例模式呢?要搞清这些问题,需要从静态方法和非静态方法的区别和联系说起. 一.静态方法常驻内存,非静态方法只有使用的时候才分配内存? 一般都认为是这样,并且怕静态方法占用过多内存而建议使用非静态方法,其实这个理解是错误的. 为什么会这样,先从内存分配开始说起: 托管堆的定义:对于32位的应用程序来说,应用程序完成进程初始化后,CLR将在进程的可用地址空间分配一块保留的地址空间,它是进程(每个进程可使用4G