精华内容
下载资源
问答
  • 1、TEST类,启动两个线程。package main;public class Test {public static void main(String[] args){TestThread t1 =new TestThread();t1.setName("T1 ");t1.start();TestThread t2 =new T...

    程序运行会报 关闭的语句: next 错误,请高手指正,谢谢!

    1、TEST类,启动两个线程。

    package main;

    public class Test {

    public static void main(String[] args){

    TestThread t1 =new TestThread();

    t1.setName("T1   ");

    t1.start();

    TestThread t2 =new TestThread();

    t2.setName("T2   ");

    t2.start();

    }

    }

    2、线程类

    package main;

    import java.sql.ResultSet;

    public class TestThread extends Thread {

    int i = 0;

    public void run() {

    while (i < 20) {

    i++;

    try {

    ResultSet rs = Controller.getInstance().getDB().Query("select SYSTIMESTAMP  from dual");

    while (rs.next())

    System.out.println(rs.getString(1));

    System.out.println(this.getName() + i);

    Thread.sleep(10);

    } catch (Exception e) {

    System.out.println(this.getName() + i + "     " + e.getMessage());

    }

    }

    }

    }

    3、控制类

    package main;

    import datebase.OraPooledSQL;

    public class Controller {

    static Controller Instance = new Controller();

    private OraPooledSQL DB = new OraPooledSQL();

    public static Controller getInstance() {

    return Instance;

    }

    public OraPooledSQL getDB() {

    return DB;

    }

    }

    4、数据库操作类

    package datebase;

    import java.sql.Connection;

    import java.sql.ResultSet;

    import java.sql.SQLException;

    import java.sql.Statement;

    import javax.sql.PooledConnection;

    import oracle.jdbc.pool.OracleConnectionPoolDataSource;

    public class OraPooledSQL {

    private PooledConnection dbpool;

    public OraPooledSQL() {

    try {

    String ConnectionURL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";

    String UserID = "ivruser";

    String PassWord = "ivruser123";

    OracleConnectionPoolDataSource ocpds = new OracleConnectionPoolDataSource();

    ocpds.setURL(ConnectionURL);

    ocpds.setUser(UserID);

    ocpds.setPassword(PassWord);

    dbpool = ocpds.getPooledConnection();

    } catch (Exception ex) {

    System.err.println("Error in PooledSQL-construct ");

    ex.printStackTrace(System.err);

    }

    }

    protected void finalize() {

    if (dbpool != null) {

    try {

    System.out.println("finalize");

    dbpool.close();

    } catch (Exception ex) {

    }

    }

    }

    public  synchronized  ResultSet Query(String SQL) throws SQLException {

    Statement stmt = null;

    ResultSet rs = null;

    Connection connection = null;

    connection = dbpool.getConnection();

    stmt = connection.createStatement();

    rs = stmt.executeQuery(SQL);

    return rs;

    }

    }

    2011年5月31日 19:25

    展开全文
  • Qt数据库连接池-多线程连接数据库

    热门讨论 2021-01-05 17:21:56
    之前在Qt上使用数据库,而Qt上一个连接只能在一个线程上使用,所以就写了一个数据库连接池,现在上传一下自己的源码,还是比较简单的使用。注释比较清晰,就不单独说了,直接上源码。 一、头文件 #ifndef ...

    前言

    之前在Qt上使用数据库,而Qt上一个连接只能在一个线程上使用,所以就写了一个数据库连接池,现在上传一下自己的源码,还是比较简单的使用。注释比较清晰,就不单独说了,直接上源码。

    |版本声明:山河君,未经博主允许,禁止转载

    原理

    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

    而其实质上连接池就是通过单例,在进行工具类调用连接后通过一个集合来建立几个连接对象。在进行连接的时候来通过集合分配对象,采用对象锁来限制多线程的资源抢夺情况。

    一、头文件

    #ifndef CSQLDATABASE_H
    #define CSQLDATABASE_H
    
    #include <QtSql>
    #include <QString>
    #include <QMutex>
    #include <QMutexLocker>
    #include <QWaitCondition>
    #include <QQueue>
    /*
     * qt时间样式
     * 年月:yyyy-mm-dd
     * 时间:hh24:mi:ss
     * 年月时间:yyyy-mm-dd hh24:mi:ss
     */
    
    
    class CSQLDatabase
    {
    public:
        /*
         * 单例模式获取
         * 参数:ip,用户名,用户密码,数据库名,数据库类型,端口号,最大连接数,最长等待时间,等待间隔
         */
        static CSQLDatabase& GetInstance(QString qsHostName, QString qsUser, QString qsPassWd,
                                         QString qsDatabase, QString qsDatabaseType, int nPort,
                                         int nMaxConn, int nMaxWaitTime, int nWaitInter);
    
        bool                ExecuteStmt(QString qsSql); //用于增删改
        QSqlQuery           ExecuteQuery(QString qsSql);//用于查询
    
        ~CSQLDatabase();
    
    private:
        CSQLDatabase(QString qsHostName, QString qsUser, QString qsPassWd,
                     QString qsDatabase, QString qsDatabaseType, int nPort,
                     int nMaxConn, int nMaxWaitTime, int nWaitInter);
    
        QSqlDatabase    OpenConnection();
        void            CloseConnection(QSqlDatabase connection);
        QSqlDatabase    CreateConnect(const QString& qsConnName);
    
    private:
        int m_nPort;
        int m_nMaxConn;
        int m_nMaxWaitTime; //最长等待时间
        int m_nWaitInter;   //等待间隔
    
        QString m_qsHostName;
        QString m_qsUser;
        QString m_qsPassWd;
        QString m_qsDatabase;
        QString m_qsDatabaseType;
    
    
        QQueue<QString> m_queUseConnNames;
        QQueue<QString> m_queUnuserConnNames;
    
        static QMutex m_Mutex;
        static QWaitCondition m_WaitConn;
        static CSQLDatabase* m_pInstance;
    };
    
    static CSQLDatabase glSqlDatabse = CSQLDatabase::GetInstance("127.0.0.1", "aaron", "0", "db", "QOCI", 1521, 5, 10, 1);
    
    #endif // CSQLDATABASE_H
    
    

    二、源文件

    #include "CSQLDatabase.h"
    
    QMutex CSQLDatabase::m_Mutex;
    CSQLDatabase* CSQLDatabase::m_pInstance = nullptr;
    QWaitCondition CSQLDatabase::m_WaitConn;
    
    CSQLDatabase& CSQLDatabase::GetInstance(QString qsHostName, QString qsUser, QString qsPassWd,
                                     QString qsDatabase, QString qsDatabaseType, int nPort,
                                     int nMaxConn, int nMaxWaitTime, int nWaitInter)
    {
        if(m_pInstance == nullptr)
        {
            QMutexLocker locker(&m_Mutex);
            m_pInstance = new CSQLDatabase(qsHostName, qsUser, qsPassWd, qsDatabase,
                                           qsDatabaseType, nPort, nMaxConn, nMaxWaitTime, nWaitInter);
        }
    
        return *m_pInstance;
    }
    
    CSQLDatabase::CSQLDatabase(QString qsHostName, QString qsUser, QString qsPassWd,
                               QString qsDatabase, QString qsDatabaseType, int nPort,
                               int nMaxConn, int nMaxWaitTime, int nWaitInter)
        :m_qsHostName(qsHostName), m_qsUser(qsUser), m_qsPassWd(qsPassWd), m_qsDatabase(qsDatabase),
          m_qsDatabaseType(qsDatabaseType), m_nPort(nPort), m_nMaxConn(nMaxConn),
          m_nMaxWaitTime(nMaxWaitTime), m_nWaitInter(nWaitInter)
    {
    }
    
    CSQLDatabase::~CSQLDatabase()
    {
        QMutexLocker locker(&m_Mutex);
        foreach(QString connName, m_pInstance->m_queUseConnNames)   //移除所有使用中的连接
            QSqlDatabase::removeDatabase(connName);
    
        foreach(QString unConnName, m_pInstance->m_queUnuserConnNames)  //移除所有未使用的连接
            QSqlDatabase::removeDatabase(unConnName);
    
        m_pInstance = nullptr;
    }
    
    QSqlDatabase CSQLDatabase::OpenConnection()
    {
        QMutexLocker locker(&m_Mutex);
        QString qsConnName;
    
        int nCountT = m_queUseConnNames.size() + m_queUnuserConnNames.size();
        //如果未到等待时间,并且所有的连接都在使用中,根据等待间隔进入到等待
        for(int i = 0; i < m_nMaxWaitTime && m_queUnuserConnNames.size() == 0 && nCountT == m_queUseConnNames.size(); i += m_nWaitInter)
        {
            //进行等待
            m_WaitConn.wait(&m_Mutex, m_nWaitInter);
            //重新计数总连接
            nCountT = m_queUseConnNames.size() + m_queUnuserConnNames.size();
        }
    
        //判断是否需要创建新连接,使用未使用连接,或者在连接全在使用时返回空的连接(可自己修改)
        if(m_queUnuserConnNames.size() > 0)
            qsConnName = m_queUnuserConnNames.dequeue();
        else if(nCountT < m_nMaxConn)
            qsConnName = QString("Connection-%1").arg(nCountT + 1);
        else {
            qDebug() << "All use sql connect";
            return QSqlDatabase();
        }
    
        //创建新连接,并放入到正在使用的连接容器中
        QSqlDatabase db = CreateConnect(qsConnName);
        if(db.isOpen())
            m_queUseConnNames.enqueue(qsConnName);
    
        return db;
    }
    
    void CSQLDatabase::CloseConnection(QSqlDatabase connection)
    {
        //关闭连接,并将连接名放回未连接容器中
        QMutexLocker locker(&m_Mutex);
        QString qsConnName = connection.connectionName();
        if(m_queUseConnNames.contains(qsConnName))
        {
            m_queUseConnNames.removeOne(qsConnName);
            m_queUnuserConnNames.enqueue(qsConnName);
            //如果某一线程已使用完连接,另一线程正在申请一个数据库连接,进行唤醒操作
            m_WaitConn.wakeOne();
        }
    }
    
    QSqlDatabase CSQLDatabase::CreateConnect(const QString &qsConnName)
    {
        //查看该连接名是否已经创建过连接
        if(QSqlDatabase::contains(qsConnName))
        {
            QSqlDatabase db = QSqlDatabase::database(qsConnName);
            return db;
        }
    
        QSqlDatabase db = QSqlDatabase::addDatabase(m_qsDatabaseType, qsConnName);
        db.setHostName(m_qsHostName);
        db.setDatabaseName(m_qsDatabase);
        db.setUserName(m_qsUser);
        db.setPassword(m_qsPassWd);
        db.setPort(m_nPort);
    
        if(!db.open())
        {
            qDebug() << "Open sql error" << db.lastError().text();
            return QSqlDatabase();
        }
    
        return db;
    }
    
    bool CSQLDatabase::ExecuteStmt(QString qsSql)
    {
        QSqlDatabase db = OpenConnection();
        if(!db.isOpen())
            return false;
    
        QSqlQuery query = db.exec(qsSql);
        CloseConnection(db);
    
        if(query.lastError().isValid())
        {
            qDebug() << "Sql error:" << query.lastError();
            return false;
        }
    
        return true;
    }
    
    QSqlQuery CSQLDatabase::ExecuteQuery(QString qsSql)
    {
        QSqlDatabase db = OpenConnection();
        if(!db.isOpen())
            return QSqlQuery();
    
        QSqlQuery query = db.exec(qsSql);
        CloseConnection(db);
    
        if(query.lastError().isValid())
        {
            qDebug() << "Sql error:" << query.lastError();
            return QSqlQuery();
        }
    
        return query;
    }
    
    
    

    总结

    未经允许,禁止转载!如果感觉对您有点用,请点个赞吧👍!

    展开全文
  • 问题描述:多线程连接三个oracle的库,报错,分别单独连接三个库,能正常连接。 解决:因为最大连接数超过了150,所以设置一下最大连接数即可。 select count(*) from v$process; ----- 查看当前连接的进程 select...

    问题描述:多线程下连接三个oracle的库,报错,分别单独连接三个库,能正常连接。
    解决:因为最大连接数超过了150,所以设置一下最大连接数即可。

    select count(*) from v$process;  ----- 查看当前连接的进程
    select value from v$parameter where name = 'processes';   -----查看当前最多看连接的进程数
    alter system set processes = 450 scope = spfile;--- 最高可连接进程数设置为45
    shutdown immediate;---立即重启服务
    startup;---立即重启服务
    
    展开全文
  • //根据行数,线程数设定每个线程要处理的数据量 for (int i = 0; i ; i++) //像线程池加入执行队列 { ThreadPool.QueueUserWorkItem(data => { int iIndex = (int)data;//线程序号0->MaxThread DataRowCollection ...

    AutoResetEvent[] autoEvents = InitAutoResetEvent();

    List lst = new List();

    //得到处理数据 集

    DataSet ds = GetBeforeJP();

    //验证数据是否存在(null)

    if (!DataHelper.VerifyDataSet(ds))

    {

    Thread.Sleep(100);

    continue;  //如果检测DataSet可行,则继续

    }

    int iCount = ds.Tables[0].Rows.Count; //获取要处理的数据行数

    int iBlock = (int)Math.Ceiling((double)iCount / MaxThread);//根据行数,线程数设定每个线程要处理的数据量

    for (int i = 0; i < MaxThread; i++) //像线程池加入执行队列

    {

    ThreadPool.QueueUserWorkItem(data =>

    {

    int iIndex = (int)data;//线程序号0->MaxThread

    DataRowCollection rows = ds.Tables[0].Rows;

    for (int j = 0; j < iBlock; j++)

    {

    try

    {

    if (iIndex * iBlock + j >= iCount)//避免最后一个线程索引越界

    break;

    int iSequence = DataHelper.ReadInt(rows[iIndex * iBlock + j] , "SEQUENCE");

    int iMCUID = DataHelper.ReadInt(rows[iIndex * iBlock + j] , "MCUID");

    int iLng = DataHelper.ReadInt(rows[iIndex * iBlock + j] , "LONGITUDE") / 36;

    int iLat = DataHelper.ReadInt(rows[iIndex * iBlock + j] , "LATITUDE") / 36;

    DateTime dtmPostionTime = DataHelper.ReadDateTime(rows[iIndex * iBlock + j] , "POSITIONTIME");

    DateTime dtmReceiveTime = DataHelper.ReadDateTime(rows[iIndex * iBlock + j] , "RECEIVETIME");

    try

    {

    //请求指定网页地址进行处理返回结果

    WebRequest jpRequest = WebRequest.Create(Config.BMSSettings.JPUrl + iLng.ToString() + "," + iLat.ToString() + "&t=" + m_rand.Next());

    jpRequest.Method = "get";

    jpRequest.ContentType = "application/x-www-form-urlencoded";

    jpRequest.Timeout = 8000;//设置超时

    WebResponse jpResponse = jpRequest.GetResponse();

    string strJP;

    using (StreamReader sr = new StreamReader(jpResponse.GetResponseStream()))

    {

    strJP = sr.ReadToEnd();

    if (!string.IsNullOrEmpty(strJP))

    {

    strJP = strJP.Remove(strJP.Length - 1 , 1);

    string[] strs = strJP.Split(new char[] { ',' });

    //处理完加入列表

    AddItemToList(lst , new EntityJPGpsInfo(iSequence , iMCUID , Convert.ToInt32(strs[0]) * 36 , Convert.ToInt32(strs[1]) * 36 , dtmPostionTime , dtmReceiveTime));

    }

    }

    jpResponse.Close();

    }

    catch (Exception ex)

    {

    LogHelper.Writeln("Error1:" + ex.Message);

    }

    }

    catch (Exception e)

    {

    LogHelper.Writeln("Error2:" + e.StackTrace);

    }

    }

    autoEvents[iIndex].Set();

    } , i);

    }

    //等待收到所有的信号

    ManualResetEvent.WaitAll(autoEvents);

    InsertToDB(lst); //处理完集体插入到数据库

    }

    });

    }

    catch (Exception exc)

    {

    LogHelper.Writeln("Error3:" + exc.StackTrace);

    }

    }

    ///

    /// 数据库提取预处理数据

    ///

    /// 预处理数据集

    public DataSet GetBeforeJP()

    {

    OracleParameter[] paras = new OracleParameter[]

    {

    OracleHelper.MakeOutParam("curCursor",OracleType.Cursor)

    };

    return OracleHelper.ExecuteDataSet(Config.BMSSettings.ConnectionString , "SP_GIS_GET_BEFOREJP" , paras);

    }

    ///

    /// 全部循环插入到数据库

    ///

    /// 插入数据列表

    public void InsertToDB(List lst)

    {

    using (OracleConnection conn = OracleHelper.GetConnection(Config.BMSSettings.ConnectionString))

    {

    conn.Open();

    OracleCommand command = conn.CreateCommand();

    OracleTransaction trans = conn.BeginTransaction();

    try

    {

    command.Transaction = trans;

    command.Parameters.AddRange(new OracleParameter[]

    {

    new OracleParameter("iSequence",OracleType.Number),

    new OracleParameter("iMCUID",OracleType.Number),

    new OracleParameter("iLongitude",OracleType.Number),

    new OracleParameter("iLatitude",OracleType.Number),

    new OracleParameter("dtmPositionTime",OracleType.DateTime),

    new OracleParameter("dtmReceiveTime",OracleType.DateTime)

    });

    foreach (EntityJPGpsInfo info in lst)

    {

    command.Parameters[0].Value = info.Sequence;

    command.Parameters[1].Value = info.MCUID;

    command.Parameters[2].Value = info.Longitude;

    command.Parameters[3].Value = info.Latitude;

    command.Parameters[4].Value = info.PositionTime;

    command.Parameters[5].Value = info.ReceiveTime;

    command.CommandType = CommandType.StoredProcedure;

    command.CommandText = "SP_GIS_ADD_JP";

    command.ExecuteNonQuery();

    }

    trans.Commit();

    }

    catch (Exception ex)

    {

    trans.Rollback();

    throw ex;

    }

    }

    }

    }

    展开全文
  • 第一种:每次需要对数据库操作的时候建立连接,操作完成后,马上关闭连接。这个方式一般用于不怎么频繁操作数据库的情况,用完后马上关闭达到节省系统资源的目的。第二种:应用程序一启动或在第一次使用数据库建立...
  • 多线程数据库连接

    2021-07-16 18:34:46
    So I'm trying to figure out best practices on my database connection. I have a large .NET GUI that serves as the front end for the MySQL db. Currently I open a connection on application load and use.....
  • 当使用线程本地数据库连接时,线程存在时需要关闭连接.我只能在覆盖调用线程的run()方法的情况下才能做到这一点.即使这不是一个很好的解决方案,因为在退出时,我不知道连接是否曾被该线程打开.问题其实是一般的:如何...
  • 最近用这种方式开发了一个非Web项目,而且是多线程的。有N个工作线程从DB中获取jobs,并把结果写回DB。简单来说就是这样。项目运行一段时间后,发现 数据库 连接耗尽了,幸好内存大,然后一直往上调,最后连接数都上...
  • 因为它会牵涉到多线程情况下,调用rollback导致的不可预期影响。官网给了两个方案:使用 Contextual/Thread-local Sessions不用全局的,而是采用函数间传递的session变量明显,第一种方式对现在代码的改动最小,扩展...
  • 哪个晓得写法一与写法二是什么原因导致结果不一样,写法一正常,写法二多线程并发conn为空。小弟在此先感谢了! public class ConnectionFactory { private static final Logger log = Logger.getLogger...
  • If I have a java code that deals with database and I want to use multi-threading in my application. Each thread suppose to run a function that contains insertion to the database. My question is: Where...
  • 它可以显着减少将数据从数据库传输到应用程序服务器的开销(特别是如果它们位于不同的计算机上并通过网络连接).考虑到您有8000万条记录要传输,这可能对您来说是最好的性能提升,尽管它取决于线程所做的工作.显然,增加...
  • 展开全部//将数据库中的数据条数62616964757a686964616fe58685e5aeb931333339663966分段publicvoiddivision(){//获取要导入的总的数据条数Stringsql3="SELECTcount(*)FROM[CMD].[dbo].[mycopy1]";try{pss=cons....
  • 前言: 网上关于Linux C/C++的连接池相关项目很少,即便是有也难以满足我的...1、支持多线程; 2、从连接池获取空闲连接时支持阻塞(直到获取到空闲连接)和非阻塞(没有空闲连接直接返回)两种形式; 3、托管了mysq
  • Qt连接Sqlite数据库的基本语句 //Qt中以数据库连接名来管理数据库连接,即 连接名 和 数据库连接 一一对应 //数据中是否存在连接connName,返回bool QSqlDatabase::contains(connName) //(当数据库连接不存在时)...
  • 通过适当的体系结构,多线程可以帮助将查询的负载抵消到CPU上,而不是进行慢速磁盘读/写操作.在某些情况下,使用CPU周期计算值更快,而不是创建计算列(之前已保存到磁盘)并从磁盘读取此列.在某些RDBMS中,有一个临时DB...
  • 数据库有自己的连接锁机制,如果是针对同一台机器使用同一个接口进行插入的话多线程和单线程是一样的。除非你有好几台数据库服务器,这样再使用多线程来进行上面的工作的话效率才会明显提高。易语言查询数据库时出现...
  • 当数据量过大时,一个程序的执行时间就会主要花费在等待单次查询返回结果,在这个过程中cpu无疑是处于等待io的空闲状态的,这样既浪费了cpu资源,又花费...知识点:数据库连接池的运用及优势,python中多线程的运用...
  • 除非您有多个数据库服务器,然后使用多线程来完成上述工作,否则效率将大大提高。在mysql的情况下,易语言多线程处理数据,新手求教?而且很容易使用mysql的子例程~,会发现一些不稳定的现象,如程序运行不稳定、...
  • 一、单线程(单条循环)插入50000条记录:每执行一次就要访问一次数据库import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql....
  • 你这种情况应该加上事务----- 更新下答案 -----查询和实际数据不一致的问题是无法避免的,我的理解题主的意思应该是在更新callback之前有其他用户购买成功的情况会导致购买失败的问题,因此可以通过加锁解决,其实...
  • 其实如果你是因为每个查询任务都比较慢,所以想采用这种方式,不如去优化一下sql。或者你可以用下面的这种线程池的方式来处理,不过代码的复杂度会大大提高的。Futrue返回的包装的数据类型对应你sql返回的类型或者你...
  • 请问多线程数据库程序怎么保证线程安全问题是这样子:多台电脑(或一台电脑中的多个线程)分别从服务器读取数据,并将数据修改后写回数据库。但如果在写入服务器时服务器内数据和本机读取时不一致,则写入操作被拒绝。...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼unsigned int __stdcall scan(PVOID pM){char ip[20];strcpy(ip, (char*)pM);MYSQL mysql;MYSQL_RES* result;...//连接mysql数据库if(!mysql_real_connect(&m...
  • 在我的主要活动的onCreate()方法中,我调用了我的dbManager的构造函数,我调用了创建SQLiteOpenHelper实例的open函数...另外两个线程检查ArrayList做什么,然后更新列表和数据库.现在我想在UI中添加一个按钮,使用AsyncT...
  • 思路:分段获取A表中的数据后,用线程同时向B表中写入。关键代码//将数据库中的数据条数分段public void division(){//获取要导入的总的数据条数String sql3="SELECT count(*) FROM [CMD].[dbo].[mycopy1]";try ...
  • 本篇介绍的是数据库端服务程序ClientForApp,它主要是主动连接转换端Server,并执行检查连接是否正常,以及接收到转换端发来的网站请求数据进行数据库数据查询并返回结果。下面首先展示“数据库端服务程序”(socket)...
  • 先将文件读取的内存中,再开启6个线程连接postgresql不同coordinator端口导入数据。代码如下:import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;import java.sql....
  • jdbc 是线程安全的,但是,推荐一个线程用一个链接JDBC is thread safe: It is quite OK to pass the various JDBC objects between threads.For example, you can create the connection in one thread; another ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 379,339
精华内容 151,735
关键字:

多线程数据库连接