热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

solrdataimport数据导入源码分析(九)

上文solrdataimport源码主要实现的是数据读取功能下面我们接着看数据连接的实现的源码:privateConnectiongetConnection()throwsE

上文solr dataimport源码主要实现的是数据读取功能

下面我们接着看数据连接的实现的源码:

private Connection getConnection()  throws Exception {
     long currTime = System.currentTimeMillis();
     if (currTime - connLastUsed > CONN_TIME_OUT) {
       synchronized ( this) {
        Connection tmpConn = factory.call();
        closeConnection();
        connLastUsed = System.currentTimeMillis();
         return conn = tmpConn;
      }

    }  else {
      connLastUsed = currTime;
       return conn;
    }

  } 


这里用到了synchronized关键字,使对 成员变量 conn访问 线程安全 
其中factory 是一个Callable类型的对象,是在初始化方法里面产生的

 java的Callable接口定义如下

public  interface Callable {
    V call()  throws Exception;

 factory 初始化

public  void init(Context context, Properties initProps) {
// 其他代码略

    factory = createConnectionFactory(context, initProps);
}

接下来看createConnectionFactory(context, initProps) 代码如下

  protected Callable createConnectionFactory(final Context context,

                                        final Properties initProps) {
//     final VariableResolver resolver = context.getVariableResolver();
    resolveVariables(context, initProps);
     final String jndiName = initProps.getProperty(JNDI_NAME);
     final String url = initProps.getProperty(URL);
     final String driver = initProps.getProperty(DRIVER);

     if (url ==  null && jndiName ==  null)
       throw  new DataImportHandlerException(SEVERE,
              "JDBC URL or JNDI name has to be specified");

     if (driver !=  null) {
       try {
        DocBuilder.loadClass(driver, context.getSolrCore());
      }  catch (ClassNotFoundException e) {
        wrapAndThrow(SEVERE, e, "Could not load driver: " + driver);
      }
    }  else {
       if(jndiName ==  null){
         throw  new DataImportHandlerException(SEVERE, "One of driver or jndiName must be specified in the data source");
      }
    }

    String s = initProps.getProperty("maxRows");
     if (s !=  null) {
      maxRows = Integer.parseInt(s);
    }

     return factory =  new Callable() {
       public Connection call()  throws Exception {
        LOG.info("Creating a connection for entity "
                + context.getEntityAttribute(DataImporter.NAME) + " with URL: "
                + url);
         long start = System.currentTimeMillis();
        Connection c =  null;
         try {
           if(url !=  null){
            c = DriverManager.getConnection(url, initProps);
          }  else  if(jndiName !=  null){
            InitialContext ctx =   new InitialContext();
            Object jndival =  ctx.lookup(jndiName);
             if (jndival  instanceof javax.sql.DataSource) {
              javax.sql.DataSource dataSource = (javax.sql.DataSource) jndival;
              String user = (String) initProps.get("user");
              String pass = (String) initProps.get("password");
               if(user ==  null || user.trim().equals("")){
                c = dataSource.getConnection();
              }  else {
                c = dataSource.getConnection(user, pass);
              }
            }  else {
               throw  new DataImportHandlerException(SEVERE,
                      "the jndi name : '"+jndiName +"' is not a valid javax.sql.DataSource");
            }
          }
        }  catch (SQLException e) {
           //  DriverManager does not allow you to use a driver which is not loaded through
          
//  the class loader of the class which is trying to make the connection.
          
//  This is a workaround for cases where the user puts the driver jar in the
          
//  solr.home/lib or solr.home/core/lib directories.
          Driver d = (Driver) DocBuilder.loadClass(driver, context.getSolrCore()).newInstance();
          c = d.connect(url, initProps);
        }
         if (c !=  null) {
           if (Boolean.parseBoolean(initProps.getProperty("readOnly"))) {
            c.setReadOnly( true);
             //  Add other sane defaults
            c.setAutoCommit( true);
            c.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
            c.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
          }
           if (!Boolean.parseBoolean(initProps.getProperty("autoCommit"))) {
            c.setAutoCommit( false);
          }
          String transactionIsolation = initProps.getProperty("transactionIsolation");
           if ("TRANSACTION_READ_UNCOMMITTED".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
          }  else  if ("TRANSACTION_READ_COMMITTED".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
          }  else  if ("TRANSACTION_REPEATABLE_READ".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
          }  else  if ("TRANSACTION_SERIALIZABLE".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
          }  else  if ("TRANSACTION_NONE".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_NONE);
          }
          String holdability = initProps.getProperty("holdability");
           if ("CLOSE_CURSORS_AT_COMMIT".equals(holdability)) {
            c.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
          }  else  if ("HOLD_CURSORS_OVER_COMMIT".equals(holdability)) {
            c.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
          }
        }
        LOG.info("Time taken for getConnection(): "
                + (System.currentTimeMillis() - start));
         return c;
      }
    };
  }

这里负责生成Connection对象


推荐阅读
author-avatar
xianghuanghaibo
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有