C# 求一个简单的数据库连接池的例子,要求是有30个连接,一个函数只要调用可以随时返回一个可用连接

C# 求一个简单的数据库连接池的例子,要求是有30个连接,一个函数只要调用可以随时返回一个可用连接,第1张

     数据库连接池 

     模块说明 

     getInstance()返回POOL唯一实例,第一次调用时将执行构造函数 

     构造函数Pool()调用驱动装载loadDrivers()函数;连接池创建createPool()函数 

     loadDrivers()装载驱动 

     createPool()建连接池 

     getConnection()返回一个连接实例 

     getConnection(long time)添加时间限制 

     freeConnection(Connection con)将con连接实例返回到连接池 

     getnum()返回空闲连接数 

     getnumActive()返回当前使用的连接数 

 /  

import javasql;  

  

public class Pool {  

  static private Pool instance = null; //定义唯一实例  

  private int maxConnect = 100;//最大连接数  

  private int normalConnect = 10;//保持连接数  

  private String password = "";//密码  

  private String url = "jdbc:mysql://localhost:3306/DB";//连接URL  

  private String user = "";//用户名  

  private String driverName = "";//驱动类  

  Driver driver = null;//驱动变量  

  DBConnectionPool pool = null;//连接池实例变量  

   

  / 

    返回唯一实例 

    @return 

   /  

  static synchronized public Pool getInstance() {  

    if (instance == null) {  

      instance = new Pool();  

    }  

    return instance;  

  }   

  / 

    将构造函数私有,不允许外界访问 

   /  

  private Pool() {  

    loadDrivers(driverName);  

    createPool();  

  }  

  / 

    装载和注册所有JDBC驱动程序 

    @param dri 

   /  

  private void loadDrivers(String dri) {  

    String driverClassName = dri;  

    try{  

      driver = (Driver) ClassforName(driverClassName)newInstance();  

      DriverManagerregisterDriver(driver);  

      Systemoutprintln("成功注册JDBC驱动程序" + driverClassName);  

    }catch (Exception e) {  

      Systemoutprintln("无法注册JDBC驱动程序:" + driverClassName + ",错误:" + e);  

    }  

  }  

  / 

    创建连接池 

   /  

  private void createPool() {  

    pool = new DBConnectionPool(password, url, user, normalConnect, maxConnect);  

    if (pool != null) {  

      Systemoutprintln("创建连接池成功");  

    }else {  

      Systemoutprintln("创建连接池失败");  

    }  

  }  

  / 

    获得一个可用的连接,如果没有则创建一个连接,且小于最大连接限制 

    @return 

   /  

  public Connection getConnection() {  

    if (pool != null) {  

      return poolgetConnection();  

    }  

    return null;  

  }  

  / 

    获得一个连接,有时间限制 

    @param time 

    @return 

   /  

  public Connection getConnection(long time) {  

    if (pool != null) {  

      return poolgetConnection(time);  

    }  

    return null;  

  }  

  / 

    将连接对象返回给连接池 

    @param con 

   /  

  public void freeConnection(Connection con) {  

    if (pool != null) {  

      poolfreeConnection(con);  

    }  

  }  

  / 

    返回当前空闲连接数 

    @return 

   /  

  public int getnum(){  

    return poolgetnum();  

  }  

  / 

    返回当前连接数 

    @return 

   /  

  public int getnumActive(){  

    return poolgetnumActive();  

  }  

  / 

    关闭所有连接,撤销驱动注册 

   /  

  public synchronized void release() {  

    poolrelease();  

    try {  

      DriverManagerderegisterDriver(driver);//撤销驱动  

      Systemoutprintln("撤销JDBC驱动程序 " + drivergetClass()getName());  

    }catch (SQLException e) {  

      Systemoutprintln("无法撤销JDBC驱动程序的注册:" + drivergetClass()getName());  

    }  

  }  

}  

  

//生成数据连接池  

import javasql;  

import javautil;  

import javautilDate;  

public class DBConnectionPool {  

  private int checkedOut;  

  private Vector<Connection> freeConnections = new Vector<Connection>();  

  private int maxConn;  

  private String password;  

  private String url;  

  private String user;  

  private static int num=0;//空闲的连接数  

  private static int numActive=0;//当前的连接数  

    

  public DBConnectionPool(String password, String url, String user,int normalConn, int maxConn) {  

    thispassword = password;  

    thisurl = url;  

    thisuser = user;  

    thismaxConn = maxConn;  

    for (int i = 0; i < normalConn; i++) { //初始normalConn个连接  

      Connection c = newConnection();  

      if (c != null)  

        {freeConnectionsaddElement(c);num++;}  

    }  

  }  

   

  / 

    释放不用的连接到连接池 

   /  

  public synchronized void freeConnection(Connection con) {  

    freeConnectionsaddElement(con);  

    num++;  

    checkedOut--;  

    numActive--;  

    notifyAll();  

  }  

   

  / 

    获取一个可用连接 

    @return 

   /  

  public synchronized Connection getConnection() {  

    Connection con = null;  

    if (freeConnectionssize() > 0) { //还有空闲的连接  

      num--;  

      con = (Connection) freeConnectionsfirstElement();  

      freeConnectionsremoveElementAt(0);  

      try {  

        if (conisClosed()) {  

          Systemoutprintln("从连接池删除一个无效连接");  

          con = getConnection();  

        }  

      }catch (SQLException e) {  

        Systemoutprintln("从连接池删除一个无效连接");  

        con = getConnection();  

      }  

    }  

    else if (maxConn == 0 || checkedOut < maxConn) { //没有空闲连接且当前连接小于最大允许值,最大值为0则不限制  

      con = newConnection();  

    }  

    if (con != null) { //当前连接数加1  

      checkedOut++;  

    }  

    numActive++;  

    return con;  

  }  

   

  / 

    获取一个连接,并加上等待时间限制,时间为毫秒 

    @param timeout 

    @return 

   /  

  public synchronized Connection getConnection(long timeout) {  

    long startTime = new Date()getTime();  

    Connection con;  

    while ((con = getConnection()) == null){  

      try {  

          wait(timeout);  

      }catch (InterruptedException e) {}  

          if((new Date()getTime() - startTime) >= timeout) {  

              Systemoutprintln("超时了!!");  

              return null; //超时返回  

          }  

    }  

    return con;  

  }  

   

  / 

    关闭所有连接 

   /  

  @SuppressWarnings("unchecked")  

  public synchronized void release() {  

    Enumeration allConnections = freeConnectionselements();  

    while (allConnectionshasMoreElements()) {  

      Connection con = (Connection) allConnectionsnextElement();  

      try {  

        conclose();  

        num--;  

      }catch (SQLException e) {  

        Systemoutprintln("无法关闭连接池中的连接");  

      }  

    }  

    freeConnectionsremoveAllElements();  

    numActive=0;  

  }  

   

  / 

    创建一个新连接 

    @return 

   /  

  private Connection newConnection() {  

    Connection con = null;  

    try {  

      if (user == null) { //用户,密码都为空  

        con = DriverManagergetConnection(url);  

      }else {  

        con = DriverManagergetConnection(url, user, password);  

      }  

      Systemoutprintln("连接池创建一个新的连接");  

    }catch (SQLException e) {  

      Systemoutprintln("无法创建这个URL的连接" + url);  

      return null;  

    }  

    return con;  

  }  

  / 

    返回当前空闲连接数 

    @return 

   /  

  public int getnum(){  

    return num;  

  }  

  / 

    返回当前连接数 

    @return 

   /  

  public int getnumActive(){  

    return numActive;  

  }  

}

什么是SQL呢

SQL就是专门用来做数据库的一门语言

和C语言差不多

(当然功能不紧紧是做数据了

编程啊

都可以

这里就不多说了)z这道题用ACCESS

就可以完成了

1

首先

用Access

2000(数据库

)做一个数据库

打开设计器创建表

在点菜单

另存为

名为班级名+自己名字英文简写

最后点保存啦

(每完成系统都是有提示的啦)

第一问

解决

2

打开设计器

上面做的表下面下

创建数据表

名字都是在最后完成时做的

先不用管

然后在输入sID,sName,sSex,sAge,sClass

注意根据后面的要求填写字段

及数据类型

以及

在做其他的问题了将T_Student表的sID字段设置为标识列,种子为1,增量为2。

为T_Student表的sSex(性别)字段设置其默认值为“男”。

为T_Student表的sAge(年龄)字段设置检查约束,规定年龄在0到30岁之间。

为T_KC表的cName(课程名称)字段设置唯一性约束。,规定课程名称不得重复。

生成一个规则t_rule,限制数据的取值范围在(0---100)之间,然后将这个规则绑定到T_CJ表的cj(成绩)字段。

为T_KC表的cName字段创建索引。

最后

当然主键当然是SID了

一定要标好哦~~·先不管作业其他要求

在依次做其他2个表;

T_KC(cID,cName,sBianhao,sXuefen)

T_CJ(sID,cID,cj)

注意主键是SID

3

做好了三个表后退出设计器

在打开以一个个表

在按要求输入(在每个表中添加3-5条记录。)

好了

基本就完成了

当然用SQL

也能完成

这些问题

并且要快

但涉及到TQL语言

编程问题

很难说清楚

就不一一解释了···

SQL Server

CREATE DATABASE部分,需要指定数据库文件与日志文件的名称、文件名、初始大小、递增方式。

CREATE DATABASE [Test] ON PRIMARY

( NAME = N'Test',

FILENAME = N'E:\Microsoft SQL Server\MSSQL1\MSSQL\DATA\Testmdf' ,

SIZE = 3072KB ,

FILEGROWTH = 1024KB )

LOG ON

( NAME = N'Test_log',

FILENAME = N'E:\Microsoft SQL Server\MSSQL1\MSSQL\DATA\Test_logldf' ,

SIZE = 1024KB ,

FILEGROWTH = 10%)

GO

建表

1> CREATE TABLE test_create_tab (

2> id INT,

3> val VARCHAR(10)

4> );

5>

6> go

以上就是关于C# 求一个简单的数据库连接池的例子,要求是有30个连接,一个函数只要调用可以随时返回一个可用连接全部的内容,包括:C# 求一个简单的数据库连接池的例子,要求是有30个连接,一个函数只要调用可以随时返回一个可用连接、如何创建数据库实例、SQL 中怎么创建数据库和表初学不会,谁能给个详细简单点的例子等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10165207.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存