net.sourceforge.jtds.jdbc

Class SharedSocket

Known Direct Subclasses:
SharedLocalNamedPipe, SharedNamedPipe

(package private) class SharedSocket
extends java.lang.Object

This class mananges the physical connection to the SQL Server and serialises its use amongst a number of virtual sockets. This allows one physical connection to service a number of concurrent statements.

Constraints and assumptions:

  1. Callers will not attempt to read from the server without issuing a request first.
  2. The end of a server reply can be identified as byte 2 of the header is non zero.
Comments:
  1. This code will discard unread server data if a new request is issued. Currently the higher levels of the driver attempt to do this but may be we can just rely on this code instead.
  2. A cancel can be issued by a caller only if the server is currently sending data for the caller otherwise the cancel is ignored.
  3. Cancel packets on their own are returned as extra records appended to the previous packet so that the TdsCore module can process them.
This version of the class will start to cache results to disk once a predetermined maximum buffer memory threshold has been passed. Small result sets that will fit within a specified limit (default 8 packets) will continue to be held in memory (even if the memory threshold has been passed) in the interests of efficiency.
Version:
$Id: SharedSocket.java,v 1.39 2007/07/08 21:38:13 bheineman Exp $
Author:
Mike Hutchinson.

Nested Class Summary

private static class
SharedSocket.VirtualSocket
This inner class contains the state information for the virtual socket.

Field Summary

private static int
TDS_DONE_LEN
Length of a TDS_DONE token.
private static int
TDS_DONE_TOKEN
TDS done token.
private static int
TDS_HDR_LEN
Length of TDS packet header.
private File
bufferDir
The directory to buffer data to.
private Object
cancelMonitor
Synchronization monitor for cancelPending and responseOwner.
private boolean
cancelPending
A cancel packet is pending.
private CharsetInfo
charsetInfo
The character set to use for converting strings to/from bytes.
private byte[]
doneBuffer
Buffer for TDS_DONE packets
private static int
globalMemUsage
Total memory usage in all instances of the driver NB.
private byte[]
hdrBuf
Buffer for packet header.
private String
host
The server host name.
private DataInputStream
in
Input stream for network socket.
private int
maxBufSize
Current maxium input buffer size.
private static int
memoryBudget
Max memory limit to use for buffers.
private static int
minMemPkts
Minimum number of packets that will be cached in memory before the driver tries to write to disk even if memoryBudget has been exceeded.
private DataOutputStream
out
Output stream for network socket.
private int
packetCount
Count of packets received.
private static int
peakMemUsage
Peak memory usage for debug purposes.
private int
port
The server port number.
private int
responseOwner
The Stream ID of the object that is expecting a response from the server.
private static boolean
securityViolation
Global flag to indicate that security constraints mean that attempts to create work files will fail.
protected int
serverType
The servertype one of Driver.SQLSERVER or Driver.SYBASE
private Socket
socket
The shared network socket.
private ArrayList
socketTable
Table of stream objects sharing this socket.
private Socket
sslSocket
The shared SSL network socket;
private int
tdsVersion
Tds protocol version

Constructor Summary

SharedSocket(File bufferDir, int tdsVersion, int serverType)
SharedSocket(ConnectionJDBC2 connection)
Construct a SharedSocket object specifying host name and port.

Method Summary

(package private) boolean
cancel(int streamId)
Send a TDS cancel packet to the server.
(package private) void
close()
Close the socket and release all resources.
(package private) void
closeStream(int streamId)
Deallocate a stream linked to this socket.
private Socket
createSocketForJDBC3(ConnectionJDBC2 connection)
Creates a Socket through reflection when Driver.JDBC3 is true.
private byte[]
dequeueInput(SharedSocket.VirtualSocket vsock)
Read a cached packet from the in memory queue or from a disk based queue.
(package private) void
disableEncryption()
Disable TLS encryption and switch back to raw TCP/IP socket.
(package private) void
enableEncryption(String ssl)
Enable TLS encryption by creating a TLS socket over the existing TCP/IP network socket.
private void
enqueueInput(SharedSocket.VirtualSocket vsock, byte[] buffer)
Save a packet buffer in a memory queue or to a disk queue if the global memory limit for the driver has been exceeded.
(package private) void
forceClose()
Force close the socket causing any pending reads/writes to fail.
(package private) String
getCharset()
Retrieve the character set name used to translate byte arrays to or from Strings.
(package private) CharsetInfo
getCharsetInfo()
Retrieve the character set descriptor used to translate byte arrays to or from Strings.
protected String
getHost()
Get the server host name.
protected DataInputStream
getIn()
Getter for in field.
(package private) static int
getMemoryBudget()
Get the global buffer memory limit for all instancs of this driver.
(package private) static int
getMinMemPkts()
Get the minimum number of memory cached packets.
(package private) byte[]
getNetPacket(int streamId, buffer[] )
Get a network packet.
protected DataOutputStream
getOut()
Getter for out field.
(package private) static int
getPktLen(buf[] )
Convert two bytes (in network byte order) in a byte array into a Java short integer.
protected int
getPort()
Get the server port number.
(package private) RequestStream
getRequestStream(int bufferSize, int maxPrecision)
Obtain an instance of a server request stream for this socket.
(package private) ResponseStream
getResponseStream(RequestStream requestStream, int bufferSize)
Obtain an instance of a server response stream for this socket.
(package private) int
getTdsVersion()
Retrieve the TDS version that is active on the connection supported by this socket.
(package private) boolean
isConnected()
Get the connected status of this socket.
private SharedSocket.VirtualSocket
lookup(int streamId)
Retrieves the virtual socket with the given id.
private byte[]
readPacket(buffer[] )
Read a physical TDS packet from the network.
(package private) byte[]
sendNetPacket(int streamId, buffer[] )
Send a network packet.
(package private) void
setCharsetInfo(CharsetInfo charsetInfo)
Set the character set descriptor to be used to translate byte arrays to or from Strings.
protected void
setIn(DataInputStream in)
Setter for in field.
(package private) static void
setMemoryBudget(int memoryBudget)
Set the global buffer memory limit for all instances of this driver.
(package private) static void
setMinMemPkts(int minMemPkts)
Set the minimum number of packets to cache in memory before writing to disk.
protected void
setOut(DataOutputStream out)
Setter for out field.
protected void
setTdsVersion(int tdsVersion)
Set the TDS version field.
protected void
setTimeout(int timeout)
Set the socket timeout.

Field Details

TDS_DONE_LEN

private static final int TDS_DONE_LEN
Length of a TDS_DONE token.
Field Value:
9

TDS_DONE_TOKEN

private static final int TDS_DONE_TOKEN
TDS done token.
Field Value:
253

TDS_HDR_LEN

private static final int TDS_HDR_LEN
Length of TDS packet header.
Field Value:
8

bufferDir

private final File bufferDir
The directory to buffer data to.

cancelMonitor

private Object cancelMonitor

cancelPending

private boolean cancelPending
A cancel packet is pending.

charsetInfo

private CharsetInfo charsetInfo
The character set to use for converting strings to/from bytes.

doneBuffer

private byte[] doneBuffer
Buffer for TDS_DONE packets

globalMemUsage

private static int globalMemUsage
Total memory usage in all instances of the driver NB. Access to this field should probably be synchronized but in practice lost updates will not matter much and I think all VMs tend to do atomic saves to integer variables.

hdrBuf

private final byte[] hdrBuf
Buffer for packet header.

host

private String host
The server host name.

in

private DataInputStream in
Input stream for network socket.

maxBufSize

private int maxBufSize
Current maxium input buffer size.

memoryBudget

private static int memoryBudget
Max memory limit to use for buffers. Only when this limit is exceeded will the driver start caching to disk.

minMemPkts

private static int minMemPkts
Minimum number of packets that will be cached in memory before the driver tries to write to disk even if memoryBudget has been exceeded.

out

private DataOutputStream out
Output stream for network socket.

packetCount

private int packetCount
Count of packets received.

peakMemUsage

private static int peakMemUsage
Peak memory usage for debug purposes.

port

private int port
The server port number.

responseOwner

private int responseOwner
The Stream ID of the object that is expecting a response from the server.

securityViolation

private static boolean securityViolation
Global flag to indicate that security constraints mean that attempts to create work files will fail.

serverType

protected final int serverType
The servertype one of Driver.SQLSERVER or Driver.SYBASE

socket

private Socket socket
The shared network socket.

socketTable

private final ArrayList socketTable
Table of stream objects sharing this socket.

sslSocket

private Socket sslSocket
The shared SSL network socket;

tdsVersion

private int tdsVersion
Tds protocol version

Constructor Details

SharedSocket

protected SharedSocket(File bufferDir,
                       int tdsVersion,
                       int serverType)

SharedSocket

(package private)  SharedSocket(ConnectionJDBC2 connection)
            throws IOException,
                   UnknownHostException
Construct a SharedSocket object specifying host name and port.
Parameters:
connection - the connection object

Method Details

cancel

(package private)  boolean cancel(int streamId)
Send a TDS cancel packet to the server.
Parameters:
streamId - the RequestStream id
Returns:
boolean true if a cancel is actually issued by this method call.

close

(package private)  void close()
            throws IOException
Close the socket and release all resources.

closeStream

(package private)  void closeStream(int streamId)
Deallocate a stream linked to this socket.
Parameters:
streamId - the ResponseStream id

createSocketForJDBC3

private Socket createSocketForJDBC3(ConnectionJDBC2 connection)
            throws IOException
Creates a Socket through reflection when Driver.JDBC3 is true. Reflection must be used to stay compatible with JDK 1.3.
Parameters:
connection - the connection object
Returns:
a socket open to the host and port with the given timeout

dequeueInput

private byte[] dequeueInput(SharedSocket.VirtualSocket vsock)
            throws IOException
Read a cached packet from the in memory queue or from a disk based queue.
Parameters:
vsock - the virtual socket owning this data
Returns:
a buffer containing the packet

disableEncryption

(package private)  void disableEncryption()
            throws IOException
Disable TLS encryption and switch back to raw TCP/IP socket.

enableEncryption

(package private)  void enableEncryption(String ssl)
            throws IOException
Enable TLS encryption by creating a TLS socket over the existing TCP/IP network socket.
Parameters:
ssl - the SSL URL property value

enqueueInput

private void enqueueInput(SharedSocket.VirtualSocket vsock,
                          byte[] buffer)
            throws IOException
Save a packet buffer in a memory queue or to a disk queue if the global memory limit for the driver has been exceeded.
Parameters:
vsock - the virtual socket owning this data
buffer - the data to queue

forceClose

(package private)  void forceClose()
Force close the socket causing any pending reads/writes to fail.

Used by the login timer to abort a login attempt.


getCharset

(package private)  String getCharset()
Retrieve the character set name used to translate byte arrays to or from Strings.
Returns:
the character set name as a String

getCharsetInfo

(package private)  CharsetInfo getCharsetInfo()
Retrieve the character set descriptor used to translate byte arrays to or from Strings.

getHost

protected String getHost()
Get the server host name.
Returns:
the host name as a String

getIn

protected DataInputStream getIn()
Returns:
InputStream used for communication

getMemoryBudget

(package private) static int getMemoryBudget()
Get the global buffer memory limit for all instancs of this driver.
Returns:
the memory limit as an int

getMinMemPkts

(package private) static int getMinMemPkts()
Get the minimum number of memory cached packets.
Returns:
minimum memory packets as an int

getNetPacket

(package private)  byte[] getNetPacket(int streamId,
                                       buffer[] )
            throws IOException
Get a network packet. This may be read from the network directly or from previously cached buffers.
Parameters:
streamId - the originating ResponseStream object
Returns:
the data in a byte[] buffer

getOut

protected DataOutputStream getOut()
Returns:
OutputStream used for communication

getPktLen

(package private) static int getPktLen(buf[] )
Convert two bytes (in network byte order) in a byte array into a Java short integer.
Parameters:
Returns:
the 16 bit unsigned value as an int

getPort

protected int getPort()
Get the server port number.
Returns:
the host port as an int

getRequestStream

(package private)  RequestStream getRequestStream(int bufferSize,
                                                  int maxPrecision)
Obtain an instance of a server request stream for this socket.
Parameters:
bufferSize - the initial buffer size to be used by the RequestStream
maxPrecision - the maximum precision for numeric/decimal types
Returns:
the server request stream as a RequestStream

getResponseStream

(package private)  ResponseStream getResponseStream(RequestStream requestStream,
                                                    int bufferSize)
Obtain an instance of a server response stream for this socket. NB. getRequestStream() must be used first to obtain the RequestStream needed as a parameter for this method.
Parameters:
requestStream - an existing server request stream object obtained from this SharedSocket
bufferSize - the initial buffer size to be used by the RequestStream
Returns:
the server response stream as a ResponseStream

getTdsVersion

(package private)  int getTdsVersion()
Retrieve the TDS version that is active on the connection supported by this socket.
Returns:
the TDS version as an int

isConnected

(package private)  boolean isConnected()
Get the connected status of this socket.
Returns:
true if the underlying socket is connected

lookup

private SharedSocket.VirtualSocket lookup(int streamId)
Retrieves the virtual socket with the given id.
Parameters:
streamId - id of the virtual socket to retrieve

readPacket

private byte[] readPacket(buffer[] )
            throws IOException
Read a physical TDS packet from the network.
Parameters:
Returns:
either the incoming buffer if it was large enough or a newly allocated buffer with the read packet

sendNetPacket

(package private)  byte[] sendNetPacket(int streamId,
                                        buffer[] )
            throws IOException
Send a network packet. If output for another virtual socket is in progress this packet will be sent later.
Parameters:
streamId - the originating RequestStream object
Returns:
the same buffer received if emptied or another buffer w/ the same size if the incoming buffer is cached (to avoid copying)

setCharsetInfo

(package private)  void setCharsetInfo(CharsetInfo charsetInfo)
Set the character set descriptor to be used to translate byte arrays to or from Strings.
Parameters:
charsetInfo - the character set descriptor

setIn

protected void setIn(DataInputStream in)
Parameters:
in - the InputStream to be used for communication

setMemoryBudget

(package private) static void setMemoryBudget(int memoryBudget)
Set the global buffer memory limit for all instances of this driver.
Parameters:
memoryBudget - the global memory budget

setMinMemPkts

(package private) static void setMinMemPkts(int minMemPkts)
Set the minimum number of packets to cache in memory before writing to disk.
Parameters:
minMemPkts - the minimum number of packets to cache

setOut

protected void setOut(DataOutputStream out)
Parameters:
out - the OutputStream to be used for communication

setTdsVersion

protected void setTdsVersion(int tdsVersion)
Set the TDS version field.
Parameters:
tdsVersion - the TDS version as an int

setTimeout

protected void setTimeout(int timeout)
            throws SocketException
Set the socket timeout.
Parameters:
timeout - the timeout value in milliseconds

Generated on September 18 2009