`

COM+数据库连接池

阅读更多

连接池
添加以下引用

System.EnterpriseServices
System.Runtime.Remoting

using System;
using System.IO;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;
using System.EnterpriseServices;

[assembly: ApplicationName("POOLINGTEST")]
[assembly: AssemblyKeyFile("poolserver.snk")]

namespace PoolServer
{
[ObjectPooling(Enabled=true,MinPoolSize=0, MaxPoolSize=1,CreationTimeout=2000)]
[JustInTimeActivation(true)]
[ConstructionEnabled(Default="Workstation id=.;data source=.;initial catalog=card;integrated security=sspi")]    //Text File to be created during construction

public class PooledFile : ServicedComponent
{
    private string strConnection;

    protected override void Construct(string constructString)
    {
     strConnection = constructString;
    }

    public string ConnectionString
    {
     get
     {
      return strConnection;
     }
    }
}
}

远程数据库访问类
添加以下引用

System.EnterpriseServices
System.Runtime.Remoting
添加连接池组件PoolServer.dll
using System;
using PoolServer;
using System.Reflection;
using System.Data;
using System.Data.SqlClient;

namespace RemoteTest
{
//SQL Server数据库连接类
public class SQLConnection:MarshalByRefObject
{
    private SqlConnection m_sqlConn;
    private SqlDataAdapter m_sqlDA;
    private SqlCommand m_sqlComm;

    public SQLConnection()
    {
     PooledFile pool = new PooledFile();
     m_sqlConn = new SqlConnection(pool.ConnectionString);
    }

    //创建一个SQLConnection连接实例
    public SQLConnection(string strConnection)
    {
     Console.WriteLine("有数构造");
     m_sqlConn = new SqlConnection(strConnection);
    }

    //执行查询,返回DataSet对象(多条记录)
    public DataSet executeQueryDS(string strQuery,string table)
    {
     open();
     m_sqlDA = new SqlDataAdapter(strQuery, m_sqlConn);
     DataSet ds = new DataSet();
     m_sqlDA.Fill(ds,table);
     close();
     return ds;
    }

    //执行查询,返回SqlDataReader对象(一条记录)
    //执行该方法后,必须执行close()方法以关闭SQL Server数据库连接
    public SqlDataReader executeQueryDR(string strQuery)
    {
     open();
     m_sqlComm = new SqlCommand(strQuery, m_sqlConn);
     SqlDataReader dr;
     dr = m_sqlComm.ExecuteReader();
     return dr;
    }

    //执行更新,返回所影响的行数
    public int executeUpdate(string strUpdate)
    {
     open();
     m_sqlComm = new SqlCommand(strUpdate, m_sqlConn);
     int rows;
     rows = m_sqlComm.ExecuteNonQuery();
     return rows;
    }
    public bool isExistProcudure(string sql, SqlParameter[] param)
    {
     m_sqlComm = new SqlCommand(sql, m_sqlConn);
     m_sqlComm.CommandType = CommandType.StoredProcedure;
     if (param != null)
     {
      foreach (SqlParameter parameter in param)
      {
       m_sqlComm.Parameters.Add(parameter);
      }
     }
     open();
     int n = Convert.ToInt32(m_sqlComm.ExecuteScalar());
     close();
     if (n >= 0)
     {
      return true;
     }
     else
     {
      return false;
     }    
    }
    //执行返回查询结果的存储过程
    public SqlDataReader executeQueryProcedure(string strCommandText, SqlParameter[] param)
    {
     open();
     m_sqlComm = new SqlCommand(strCommandText, m_sqlConn);
     m_sqlComm.CommandType = CommandType.StoredProcedure;
   
     if (param != null)
     {
      foreach (SqlParameter parameter in param)
      {
       if(parameter != null)
       {
        m_sqlComm.Parameters.Add(parameter);
       }
      }
     }

     SqlDataReader dr = m_sqlComm.ExecuteReader();
     return dr;
    }

    //执行更新,返回所影响行数的存储过程
    public int executeUpdateProcedure(string strCommandText, SqlParameter[] param)
    {
     open();
     m_sqlComm = new SqlCommand(strCommandText, m_sqlConn);
     m_sqlComm.CommandType = CommandType.StoredProcedure;
   
     if (param != null)
     {
      foreach (SqlParameter parameter in param)
      {
       if(parameter != null)
       {
        m_sqlComm.Parameters.Add(parameter);
       }
      }
     }

     int rows = m_sqlComm.ExecuteNonQuery();
     return rows;
    }

    //打开SQLConnection连接
    public void open()
    {
     if(m_sqlConn.State == ConnectionState.Closed)
     {
      m_sqlConn.Open();
     }
    }

    //关闭SQLConnection连接
    public void close()
    {
     if(m_sqlConn.State == ConnectionState.Open)
     {
      m_sqlConn.Close();
     }
    }
}
}

服务器
添加以下引用
System.EnterpriseServices
System.Runtime.Remoting
添加数据库访问类组件RemoteTest.dll

private SQLConnection obj;
    private bool m_bSign=true;
    private void sign()
    {
     TcpServerChannel channel = new TcpServerChannel(9932);
     obj = new SQLConnection();
     ChannelServices.RegisterChannel(channel);
     ObjRef    objref=RemotingServices.Marshal(obj, "TestLoader", typeof(SQLConnection));
    }
    private void btn_start_Click(object sender, System.EventArgs e)
    {
   
     //RemotingConfiguration.RegisterWellKnownServiceType(typeof(SQLConnection),
     // "TestLoader", WellKnownObjectMode.Singleton );
   
     if(m_bSign)
     {
      m_bSign=false;
      this.sign();
     }
     else
     {
      ObjRef objrefWellKnown = RemotingServices.Marshal(obj, "TestLoader");
     }
     this.lb_message.Items.Clear();
     this.lb_message.Items.Add("CM+服务器已起动!!!");
     this.btn_start.Enabled=false;
     this.btn_stop.Enabled=true;
    }

    private void btn_stop_Click(object sender, System.EventArgs e)
    {
     this.btn_stop.Enabled=false;
     this.btn_start.Enabled=true;
     RemotingServices.Disconnect(obj);
     //ChannelServices.UnregisterChannel(channel);
     this.lb_message.Items.Add("COM+服务器已关闭!!!");
    }

    private void menuItem_openServer_Click(object sender, System.EventArgs e)
    {
     if(m_bShowWnd==true)
     {
      this.Visible=true;
      m_bShowWnd=false;
     }
    }

    private void menuItem_minimize_Click(object sender, System.EventArgs e)
    {
     if(m_bShowWnd==false)
     {
      this.Visible=false;
      m_bShowWnd=true;
     }
    }

    private void menuItem_exit_Click(object sender, System.EventArgs e)
    {
     DialogResult result=MessageBox.Show("你确定要退出COM+服务器吗?如果单击是,它将终止所有访问数据库的服务.","信息提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
     if(result==DialogResult.Yes)
     {
      this.Close();
     }
    }

    private void notifyIcon1_DoubleClick(object sender, System.EventArgs e)
    {
     m_bShowWnd=false;
     this.Visible=true;
    }
  
    private void button1_Click(object sender, System.EventArgs e)
    {
     menuItem_exit_Click(null,null);
    }

    private void label2_Click(object sender, System.EventArgs e)
    {
     if(m_bShowWnd==false)
     {
      this.Visible=false;
      m_bShowWnd=true;
     }
    }

客户端
添加以下引用

System.EnterpriseServices
System.Runtime.Remoting
添加数据库访问类组件RemoteTest.dll
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteTest;
using System.Data.SqlClient;
namespace Client
{
public class ClassClient
{
    static void Main(string[] args)
    {   
     try
     {
      ChannelServices.RegisterChannel(new TcpClientChannel());
      SQLConnection loader=(SQLConnection)Activator.GetObject(typeof(SQLConnection),"tcp://localhost:9932/TestLoader");
   
      if(loader==null)
      {
       Console.WriteLine("Unable to get remote");
      }

else

{
      SqlParameter[] param=new SqlParameter[2];
      param[0] = new SqlParameter("@emp_id", SqlDbType.NChar, 9);     //存储过程的输入参数
      param[0].Value = "PMA42628M";      
      param[1] = new SqlParameter("@emp_name", SqlDbType.NVarChar, 20); //存储过程的输出参数
      param[1].Direction = ParameterDirection.Output;

      ESqlParameter[] eparam = new ESqlParameter[2];
      eparam[0] = new ESqlParameter(param[0]);
      eparam[1] = new ESqlParameter(param[1]);
    
      IFormatter formatter = new BinaryFormatter();
      Stream stream = new FileStream("MyFile.txt", FileMode.Create, FileAccess.Write, FileShare.None, 1000, true);
      formatter.Serialize(stream, eparam);
    
      //执行根据指定员工编号查询员工名字的存储过程
      SqlDataReader dr =loader .executeQueryProcedure("prcGetEmpName", stream);
      stream.Close();
      stream = null;
      GC.Collect();

      System.Console.WriteLine("员工编号 : " + param[0].Value);
      System.Console.WriteLine("员工名字 : " + param[1].Value);       
      conn.close();
     }
     catch(SingletonException err)
     {
      System.Console.WriteLine(err.Message);
     }
     catch(Exception err)
     {
      System.Console.WriteLine(err.ToString());
     }
    }

[Serializable]
public class ESqlParameter
{
    public ESqlParameter(SqlParameter sPara)
    {
     this.paraName = sPara.ParameterName ;
     this.paraLen    = sPara.Size ;
     this.paraVal    = sPara.Value ;
     this.sqlDbType= sPara.SqlDbType ;        
    }

    public SqlParameter ToSqlParameter()
    {
     SqlParameter para = new SqlParameter(this.paraName ,this.sqlDbType ,this.paraLen) ;
     para.Value = this.paraVal ;

     return para ;
    }

    private string paraName = "" ;
    public string ParaName
    {
     get
     {
      return this.paraName ;
     }
     set
     {
      this.paraName = value ;
     }
    }

    private int paraLen = 0 ;
    public int ParaLen
    {
     get
     {
      return this.paraLen ;
     }
     set
     {
      this.paraLen = value ;
     }
    }
    
    private object paraVal = null ;
    public object ParaVal
    {
     get
     {
      return this.paraVal ;
     }
     set
     {
      this.paraVal = value ;
     }
    }    

    private SqlDbType sqlDbType = SqlDbType.NVarChar ;
    public SqlDbType SqlDbType
    {
     get
     {
      return this.sqlDbType ;
     }
     set
     {
      this.sqlDbType = value ;
     }
    }
}

一步:打开管理工具,打开服务,然后把所有关于COM+的服务起动
二步:起动Distributed Transaction Coordinator服务
三步:注册强名称
1.打开.net命令窗口
2.定位COM+所在目标,然后输入 sn -k 强名称
二步:起动服务器
三步:客房端访问

分享到:
评论

相关推荐

    jdbc+数据库连接池+dbutils

    数据库连接池是一种管理数据库连接的技术,它可以复用预创建的数据库连接,而不是每次请求时都创建新的连接。这有助于减少数据库连接的开销,提高系统的性能和响应速度。常见的数据库连接池有C3P0、DBCP等。 ##### ...

    java + SQL数据库连接池!!!!!!!!!!!!!

    数据库连接池在Java和SQL应用中扮演着至关重要的角色,它是优化数据库操作性能、提高系统资源利用率的关键技术。本文将深入探讨Java与SQL数据库连接池的概念、工作原理、优势以及如何在实际项目中进行配置和使用。 ...

    MVC+数据库链接池功能实现

    数据库连接池是为了解决频繁创建和销毁数据库连接而产生的性能开销。它预先初始化一组数据库连接,并保存在内存中,当需要连接数据库时,不再直接创建新的连接,而是从连接池中获取已存在的连接,用完后归还而不是...

    JAVA+ACCESS连接池(精典)

    在Java编程中,数据库连接池是一种管理数据库连接的机制,它允许程序重复使用一个已经存在的数据库连接,而不是每次需要访问数据库时都创建新的连接。这极大地提高了应用的性能和效率,因为建立和关闭数据库连接是...

    SpringBoot+MyBatis+Druid连接池+JDBC官方驱动+ClickHouse

    Druid是阿里巴巴开源的一款高性能、智能的数据库连接池。它不仅提供了强大的监控和扩展功能,还具备连接池管理、SQL解析、SQL执行效率分析等特性。Druid与SpringBoot的整合,使得数据库连接资源管理更加高效和稳定。...

    proxool数据库连接池实例(带监控功能)

    数据库连接池是现代应用程序开发中的重要组件,它有效地管理和复用数据库连接,从而提高系统性能并减少资源消耗。本文将详细介绍Proxool数据库连接池及其监控功能,通过一个实际的实例来展示其工作原理和使用方法。 ...

    数据库连接池eclipse+MySQL

    数据库连接池是现代Java应用程序中管理数据库连接的关键技术,它能显著提高应用性能并优化资源利用率。在本示例中,我们将关注如何在Eclipse集成开发环境中配置和使用数据库连接池来连接MySQL数据库,主要涉及JDBC...

    thinkphp5-swoole 数据库连接池实现

    基于tp5的swoole支持,对th5的connection进行改造,使用Swoole\Coroutine\MySQL重写了基于swoole的PDO接口,实现了mysql的数据库连接池,本地测试可用。使用时,替换thinkphp/library/think/db/Connection.php,并...

    jsp连接MySQL用连接池方式步骤

    连接池是一种用于管理数据库连接的技术,它可以复用现有的连接,避免频繁创建和销毁连接所带来的资源开销。使用连接池可以显著提升数据库访问速度,并且能够更好地控制并发访问。 #### 三、JSP应用中使用连接池的...

    proxool+mysql+tomcat连接池所需jar包

    数据库连接池是在应用服务器启动时预创建一定数量的数据库连接,然后在应用运行过程中,当需要与数据库交互时,不再直接创建新的连接,而是从连接池中获取一个已存在的连接,用完后归还,而不是关闭,这样减少了...

    Spring+Hibernate+Proxool连接池

    标题 "Spring+Hibernate+Proxool连接池" 涉及到的是在Java Web开发中,如何使用Spring框架集成Hibernate ORM框架,并结合Proxool作为数据库连接池的技术实践。这通常是为了提高应用性能,有效管理和复用数据库连接,...

    德鲁伊数据库连接池jar包免费下载地址

    根据题目提供的链接(https://repo1.maven.org/maven2/com/alibaba/druid/),我们可以了解到德鲁伊数据库连接池jar包的下载地址。通常情况下,开发人员会通过Maven或Gradle等构建工具将Druid加入到项目的依赖中。...

    数据库连接池配置使用驱动(sqlserver+mysql)

    数据库连接池是现代Web应用程序中不可或缺的组件,它有效地管理数据库连接,提高系统性能并减少资源浪费。在Java环境中,常见的连接池实现有Apache的DBCP、C3P0、HikariCP以及Tomcat内置的Tomcat-jdbc-pool等。本...

    springboot +mybatis(durid的数据库连接池)+freemarker--可能我freemaker的依赖没有加到时候自己再pom文件下加一下

    本项目结合了MyBatis作为持久层框架,以及Durid作为数据库连接池,进一步优化了数据库操作的性能。同时,Freemarker被选为视图模板引擎,用于生成动态HTML页面。下面将详细解释这些技术及其在项目中的应用。 1. **...

    mysql+tomcat连接池配置

    连接池是一种管理数据库连接的机制,它预先创建并维护一定数量的数据库连接,当应用程序需要时,可以从池中获取一个已存在的连接,使用完毕后再归还,而不是每次建立新的连接。这样可以显著减少连接的创建和销毁时间...

    springboot+ mybatis+druid连接池(带监控)

    Druid是阿里巴巴开源的一个高性能的数据库连接池实现,除了基本的数据库连接池功能外,它还提供了强大的监控和扩展能力。Druid可以监控数据库连接池的状态,包括连接的创建、关闭、空闲、活跃等信息,这对于系统的...

Global site tag (gtag.js) - Google Analytics