`
wu_quanyin
  • 浏览: 208166 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

Mysql JDBC驱动源码分析(socket的连接创建)三

 
阅读更多

Socket的连接创建

代码往下调试进入ConnectionImp下的createNewIO()方法

 

public synchronized void createNewIO(boolean isForReconnect)
			throws SQLException {

		Properties mergedProps  = exposeAsProperties(this.props);

		if (!getHighAvailability()) {
                        //进入该方法
			connectOneTryOnly(isForReconnect, mergedProps);
			
			return;
		} 
                      //???
		connectWithRetries(isForReconnect, mergedProps);
		
	}

 private void connectOneTryOnly(boolean isForReconnect,

			Properties mergedProps) throws SQLException {
		Exception connectionNotEstablishedBecause = null;

		try {
			//IO创建主要在这个方法里
			coreConnect(mergedProps);
			this.connectionId = this.io.getThreadId();
			this.isClosed = false;

			// save state from old connection
			boolean oldAutoCommit = getAutoCommit();
			int oldIsolationLevel = this.isolationLevel;
			boolean oldReadOnly = isReadOnly();
			String oldCatalog = getCatalog();

			this.io.setStatementInterceptors(this.statementInterceptors);
			
			// Server properties might be different
			// from previous connection, so initialize
			// again...
			initializePropsFromServer();

			if (isForReconnect) {
				// Restore state from old connection
				setAutoCommit(oldAutoCommit);

				if (this.hasIsolationLevels) {
					setTransactionIsolation(oldIsolationLevel);
				}

				setCatalog(oldCatalog);
				
				setReadOnly(oldReadOnly);
			}
			return;
			
		} catch (Exception EEE) {
			if (this.io != null) {
				this.io.forceClose();
			}

			connectionNotEstablishedBecause = EEE;

			if (EEE instanceof SQLException) {
				throw (SQLException)EEE;
			}
			
			SQLException chainedEx = SQLError.createSQLException(
					Messages.getString("Connection.UnableToConnect"),
					SQLError.SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE, getExceptionInterceptor());
			chainedEx.initCause(connectionNotEstablishedBecause);
			
			throw chainedEx;
		}
	}

 进入coreconnect()方法

 

private void coreConnect(Properties mergedProps) throws SQLException,
			IOException {
		int newPort = 3306;
		String newHost = "localhost";
		
		String protocol = mergedProps.getProperty(NonRegisteringDriver.PROTOCOL_PROPERTY_KEY);
		
		if (protocol != null) {
			// "new" style URL

			if ("tcp".equalsIgnoreCase(protocol)) {
				newHost = normalizeHost(mergedProps.getProperty(NonRegisteringDriver.HOST_PROPERTY_KEY));
				newPort = parsePortNumber(mergedProps.getProperty(NonRegisteringDriver.PORT_PROPERTY_KEY, "3306"));
			} else if ("pipe".equalsIgnoreCase(protocol)) {
				setSocketFactoryClassName(NamedPipeSocketFactory.class.getName());
				
				String path = mergedProps.getProperty(NonRegisteringDriver.PATH_PROPERTY_KEY);
				
				if (path != null) {
					mergedProps.setProperty(NamedPipeSocketFactory.NAMED_PIPE_PROP_NAME, path);
				}
			} else {
				// normalize for all unknown protocols
				newHost = normalizeHost(mergedProps.getProperty(NonRegisteringDriver.HOST_PROPERTY_KEY));
				newPort = parsePortNumber(mergedProps.getProperty(NonRegisteringDriver.PORT_PROPERTY_KEY, "3306"));
			}
		} else {
		
			String[] parsedHostPortPair = NonRegisteringDriver
					.parseHostPortPair(this.hostPortPair);
			newHost = parsedHostPortPair[NonRegisteringDriver.HOST_NAME_INDEX];

			newHost = normalizeHost(newHost);

			if (parsedHostPortPair[NonRegisteringDriver.PORT_NUMBER_INDEX] != null) {
				newPort = parsePortNumber(parsedHostPortPair[NonRegisteringDriver.PORT_NUMBER_INDEX]);
			}
		}

		this.port = newPort;
		this.host = newHost;
		
              //MysqlIO的创建,用来于服务器进行通信
		this.io = new MysqlIO(newHost, newPort,
				mergedProps, getSocketFactoryClassName(),
				getProxy(), getSocketTimeout(),
				this.largeRowSizeThreshold.getValueAsInt());

     

		this.io.doHandshake(this.user, this.password,
				this.database);
	}

 MysqlIO构造器的创建

 

 public MysqlIO(String host, int port, Properties props,
        String socketFactoryClassName, MySQLConnection conn,
        int socketTimeout, int useBufferRowSizeThreshold) throws IOException, SQLException {
        this.connection = conn;
        
        if (this.connection.getEnablePacketDebug()) {
            this.packetDebugRingBuffer = new LinkedList();
        }
        this.traceProtocol = this.connection.getTraceProtocol();
        

        this.useAutoSlowLog = this.connection.getAutoSlowLog();
        
        this.useBufferRowSizeThreshold = useBufferRowSizeThreshold;
        this.useDirectRowUnpack = this.connection.getUseDirectRowUnpack();

        this.logSlowQueries = this.connection.getLogSlowQueries();

        this.reusablePacket = new Buffer(INITIAL_PACKET_SIZE);
        this.sendPacket = new Buffer(INITIAL_PACKET_SIZE);

        this.port = port;
        this.host = host;

        this.socketFactoryClassName = socketFactoryClassName;
        this.socketFactory = createSocketFactory();
        this.exceptionInterceptor = this.connection.getExceptionInterceptor();
        
        try {//创建得到一个socket
        	this.mysqlConnection = this.socketFactory.connect(this.host,
        		this.port, props);
	        
	
	        if (socketTimeout != 0) {
	        	try {
	        		this.mysqlConnection.setSoTimeout(socketTimeout);
	        	} catch (Exception ex) {
	        		/* Ignore if the platform does not support it */
	        	}
	        }
	
	        this.mysqlConnection = this.socketFactory.beforeHandshake();
	
	        if (this.connection.getUseReadAheadInput()) {
              //创建input流
	        	this.mysqlInput = new ReadAheadInputStream(this.mysqlConnection.getInputStream(), 16384,
	        			this.connection.getTraceProtocol(),
	        			this.connection.getLog());
	        } else if (this.connection.useUnbufferedInput()) {
	        	this.mysqlInput = this.mysqlConnection.getInputStream();
	        } else {
	        	this.mysqlInput = new BufferedInputStream(this.mysqlConnection.getInputStream(),
	        			16384);
	        }
	      //创建output流
	        this.mysqlOutput = new BufferedOutputStream(this.mysqlConnection.getOutputStream(),
	        		16384);
	
	
	        this.isInteractiveClient = this.connection.getInteractiveClient();
	        this.profileSql = this.connection.getProfileSql();
	        this.autoGenerateTestcaseScript = this.connection.getAutoGenerateTestcaseScript();
	
	        this.needToGrabQueryFromPacket = (this.profileSql ||
	        		this.logSlowQueries ||
	        		this.autoGenerateTestcaseScript);
	
	        if (this.connection.getUseNanosForElapsedTime()
					&& Util.nanoTimeAvailable()) {
				this.useNanosForElapsedTime = true;
	
				this.queryTimingUnits = Messages.getString("Nanoseconds");
			} else {
				this.queryTimingUnits = Messages.getString("Milliseconds");
			}
	
			if (this.connection.getLogSlowQueries()) {
				calculateSlowQueryThreshold();
			}
        } catch (IOException ioEx) {
        	throw SQLError.createCommunicationsException(this.connection, 0, 0, ioEx, getExceptionInterceptor());
        }
    }
  

 

 

分享到:
评论

相关推荐

    mysql-driver:mysql jdbc驱动源码阅读

    在“mysql-driver:mysql jdbc驱动源码阅读”这个主题中,我们将深入探讨该驱动的工作原理、关键组件以及源码分析。 1. **JDBC驱动类型**: JDBC驱动分为四种类型:Type 1、Type 2、Type 3 和 Type 4。MySQL ...

    java做的聊天室完整版《源码》

    在聊天室中,服务器端创建ServerSocket,监听指定端口,当有客户端通过Socket连接时,服务器端会创建一个新的Socket对象来处理这个连接。客户端也会创建一个Socket连接到服务器,通过这两个Socket对象,数据可以在...

    java聊天源码

    7. **数据库集成**:为了存储用户信息、聊天记录等,源码可能会连接到数据库,如MySQL或MongoDB。这涉及到JDBC(Java Database Connectivity)或其他ORM框架,如Hibernate或MyBatis,用于在Java应用程序和数据库之间...

    JAVA简单服务器源代码

    开发者需要加载MySQL的JDBC驱动,然后使用DriverManager.getConnection()方法建立到MySQL服务器的连接。接着,可以通过Statement或PreparedStatement对象执行SQL查询和操作。 描述中的“支持转送个人基本信息”表明...

    Java类QQ程序源码

    Java提供了多种数据库API,如JDBC(Java Database Connectivity),用于连接和操作关系型数据库,如MySQL或Oracle。 7. **事件驱动编程**:在GUI编程中,事件驱动编程是常见的模式。用户界面中的按钮点击、文本输入...

    及时聊天软件 java源码

    这部分内容可能涵盖SQL查询、JDBC驱动的使用等。 7. **安全与加密**:为了保护用户隐私,聊天软件可能会实现消息的加密传输。Java提供了诸如SSL/TLS等安全套接层,源码中可能包含相关实现。 8. **事件监听与处理**...

    java毕业设计&课设-QQ聊天器(视频+源码+资料).doc

    - JDBC驱动的加载与连接数据库; - SQL语句的编写与执行; - ResultSet的解析与数据展示。 #### 六、学习资源 - **视频教程**:提供详细的开发步骤讲解,帮助理解整个项目的构建过程。 - **源代码**:通过分析源...

    JAVA的ICQ系统源码.zip

    如果是数据库,可能采用的是JDBC(Java Database Connectivity)来连接并操作数据库,例如MySQL或SQLite。 5. **对象序列化与反序列化**:在网络通信中,Java的`java.io.Serializable`接口可以用来序列化对象,将其...

    java开发 QQ聊天 源码

    在Java开发中,这通常涉及到数据库操作,如使用JDBC(Java Database Connectivity)连接到MySQL或其他关系型数据库,存储和验证用户信息。用户注册时,需要收集用户名、密码(通常会加密存储)和其他必要信息。登录...

    Java源码的仿QQ聊天程序.7z

    程序可能使用JDBC(Java Database Connectivity)来连接和操作数据库,如MySQL或Oracle。 10. **异常处理**:为了确保程序的健壮性,开发者会在关键部分添加异常处理代码,捕获并处理可能出现的错误情况,如网络...

    聊天室Java版源码

    Java提供了JDBC(Java Database Connectivity)API来连接和操作各种类型的数据库,如MySQL、Oracle等。 8. **安全性**:为了保证聊天室的安全性,可能需要实现用户认证和授权机制,例如用户名和密码的验证,防止...

    java源码:iCHAT聊天室基于Java.rar

    数据库操作也可能涉及,如果iCHAT聊天室保存聊天记录,那么可能使用了JDBC(Java Database Connectivity)来与MySQL、Oracle等数据库进行交互,实现数据的持久化存储。 总的来说,"java源码:iCHAT聊天室基于Java....

    Java聊天室程序源码(毕业设计版)

    这需要数据库的支持,如使用JDBC操作MySQL等数据库。 6. **GUI设计**:为了让用户界面友好,聊天室通常会使用图形用户界面(GUI)。Java的Swing或JavaFX库可以用来创建用户界面,如按钮、文本框、聊天窗口等。 7. ...

    基于java的防QQ即时通信系统源码

    - Java提供了Socket编程接口,允许开发者创建客户端和服务器端的连接,这是构建即时通信系统的基础。 - Java NIO(非阻塞I/O)可以提高系统的并发性能,尤其是在处理大量连接时。 2. **多线程技术** - 即时通信...

    JAVA聊天系统

    5. **源码分析**:王冲海的JAVA聊天系统源码可能包含了模块化的代码结构,包括用户登录模块、聊天模块、文件传输模块等,每个模块都有明确的功能划分,方便理解和维护。 6. **资源管理**:系统可能涉及到了资源文件...

    Java版QQ通讯工具(完整源码版)

    - **数据库操作**:SQL语句的编写,以及如何使用JDBC进行数据库连接和操作。 这个项目对初学者来说是一个很好的实践平台,可以帮助他们将理论知识转化为实际项目经验。对于有经验的开发者,它也是一个研究和借鉴的...

    天堂2 服务端java源码

    - Java源码可能包含多个模块,如数据库连接、网络通信、游戏逻辑处理、安全性控制等。 3. **网络通信** - 使用Java的Socket编程实现TCP/IP协议,用于可靠的数据传输。服务端接收客户端的请求,解析数据并作出响应...

    java版飞信客户端源码

    Java版飞信客户端源码分析 飞信是中国移动推出的一款即时通讯软件,它允许用户通过互联网或移动网络进行免费的短信、语音通话等通信服务。本文将深入探讨Java版飞信客户端的源码,帮助开发者了解其内部工作原理,...

    基于Java的源码-iCHAT聊天室基于Java.zip

    1. **Java网络编程**:iCHAT的核心功能是实现用户间的实时通信,这需要使用Java的Socket编程,创建TCP或UDP连接,以便数据的可靠传输。 2. **多线程处理**:为了处理多个并发连接,Java的多线程技术是必不可少的。...

    JAVA上百实例源码以及开源项目源代码

    摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程...

Global site tag (gtag.js) - Google Analytics