diff --git a/core/lib/Drupal/Core/Database/Connection.php b/core/lib/Drupal/Core/Database/Connection.php
index 7092acc..e288ff3 100644
--- a/core/lib/Drupal/Core/Database/Connection.php
+++ b/core/lib/Drupal/Core/Database/Connection.php
@@ -143,16 +143,24 @@
    * Constructs a Connection object.
    */
   public function __construct(\PDO $connection, array $connection_options) {
+    $this->connection = $connection;
+    $this->connectionOptions = $connection_options;
+
+    // Run driver-specific initialization procedures.
+    $this->init();
+  }
+
+  /**
+   * Initializes driver-specific configuration.
+   */
+  protected function init() {
     // Initialize and prepare the connection prefix.
-    $this->setPrefix(isset($connection_options['prefix']) ? $connection_options['prefix'] : '');
+    $this->setPrefix(isset($this->connectionOptions['prefix']) ? $this->connectionOptions['prefix'] : '');
 
     // Set a Statement class, unless the driver opted out.
     if (!empty($this->statementClass)) {
-      $connection->setAttribute(\PDO::ATTR_STATEMENT_CLASS, array($this->statementClass, array($this)));
+      $this->connection->setAttribute(\PDO::ATTR_STATEMENT_CLASS, array($this->statementClass, array($this)));
     }
-
-    $this->connection = $connection;
-    $this->connectionOptions = $connection_options;
   }
 
   /**
@@ -1320,12 +1328,8 @@ public function unserialize($serialized) {
     // Re-establish the PDO connection using the original options.
     $this->connection = static::open($this->connectionOptions);
 
-    // Re-set a Statement class if necessary.
-    if (!empty($this->statementClass)) {
-      $this->connection->setAttribute(\PDO::ATTR_STATEMENT_CLASS, array($this->statementClass, array($this)));
-    }
-
-    $this->setPrefix(isset($this->connectionOptions['prefix']) ? $this->connectionOptions['prefix'] : '');
+    // Run driver-specific initialization procedures.
+    $this->init();
   }
 
 }
diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
index 8a70fb0..57d29a3 100644
--- a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
+++ b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
@@ -35,18 +35,16 @@ class Connection extends DatabaseConnection {
   protected $needsCleanup = FALSE;
 
   /**
-   * Constructs a Connection object.
+   * {@inheritdoc}
    */
-  public function __construct(\PDO $connection, array $connection_options = array()) {
-    parent::__construct($connection, $connection_options);
+  protected function init() {
+    parent::init();
 
     // This driver defaults to transaction support, except if explicitly passed FALSE.
-    $this->transactionSupport = !isset($connection_options['transactions']) || ($connection_options['transactions'] !== FALSE);
+    $this->transactionSupport = !isset($this->connectionOptions['transactions']) || ($this->connectionOptions['transactions'] !== FALSE);
 
     // MySQL never supports transactional DDL.
     $this->transactionalDDLSupport = FALSE;
-
-    $this->connectionOptions = $connection_options;
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php b/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
index 3b5dbee..05132af 100644
--- a/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
+++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
@@ -32,20 +32,18 @@ class Connection extends DatabaseConnection {
   const DATABASE_NOT_FOUND = 7;
 
   /**
-   * Constructs a connection object.
+   * {@inheritdoc}
    */
-  public function __construct(\PDO $connection, array $connection_options) {
-    parent::__construct($connection, $connection_options);
+  protected function init() {
+    parent::init();
 
     // This driver defaults to transaction support, except if explicitly passed FALSE.
-    $this->transactionSupport = !isset($connection_options['transactions']) || ($connection_options['transactions'] !== FALSE);
+    $this->transactionSupport = !isset($this->connectionOptions['transactions']) || ($this->connectionOptions['transactions'] !== FALSE);
 
     // Transactional DDL is always available in PostgreSQL,
     // but we'll only enable it if standard transactions are.
     $this->transactionalDDLSupport = $this->transactionSupport;
 
-    $this->connectionOptions = $connection_options;
-
     // Force PostgreSQL to use the UTF-8 character set by default.
     $this->connection->exec("SET NAMES 'UTF8'");
 
diff --git a/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php b/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php
index b2af0c3..f23bee5 100644
--- a/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php
+++ b/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php
@@ -62,15 +62,13 @@ class Connection extends DatabaseConnection {
   var $tableDropped = FALSE;
 
   /**
-   * Constructs a \Drupal\Core\Database\Driver\sqlite\Connection object.
+   * {@inheritdoc}
    */
-  public function __construct(\PDO $connection, array $connection_options) {
-    parent::__construct($connection, $connection_options);
+  protected function init() {
+    parent::init();
 
     // This driver defaults to transaction support, except if explicitly passed FALSE.
-    $this->transactionSupport = $this->transactionalDDLSupport = !isset($connection_options['transactions']) || $connection_options['transactions'] !== FALSE;
-
-    $this->connectionOptions = $connection_options;
+    $this->transactionSupport = $this->transactionalDDLSupport = !isset($this->connectionOptions['transactions']) || $this->connectionOptions['transactions'] !== FALSE;
 
     // Attach one database for each registered prefix.
     $prefixes = $this->prefixes;
@@ -80,7 +78,7 @@ public function __construct(\PDO $connection, array $connection_options) {
         // Only attach the database once.
         if (!isset($this->attachedDatabases[$prefix])) {
           $this->attachedDatabases[$prefix] = $prefix;
-          $this->query('ATTACH DATABASE :database AS :prefix', array(':database' => $connection_options['database'] . '-' . $prefix, ':prefix' => $prefix));
+          $this->query('ATTACH DATABASE :database AS :prefix', array(':database' => $this->connectionOptions['database'] . '-' . $prefix, ':prefix' => $prefix));
         }
 
         // Add a ., so queries become prefix.table, which is proper syntax for
@@ -507,4 +505,15 @@ public function popTransaction($name) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function serialize() {
+    // Don't serialize the 'attachedDatabases' property because it's lazily
+    // populated in static::init().
+    unset($this->attachedDatabases);
+
+    return parent::serialize();
+  }
+
 }
diff --git a/core/modules/system/src/Tests/Database/ConnectionUnitTest.php b/core/modules/system/src/Tests/Database/ConnectionUnitTest.php
index 74d0de7..cf96838 100644
--- a/core/modules/system/src/Tests/Database/ConnectionUnitTest.php
+++ b/core/modules/system/src/Tests/Database/ConnectionUnitTest.php
@@ -244,7 +244,16 @@ public function testConnectionSerialization() {
       $value->setAccessible(TRUE);
 
       // Skip properties that are lazily populated on access.
-      if ($value->getName() === 'driverClasses' || $value->getName() === 'schema') {
+      $skip_properties = [
+        'driverClasses',
+        'schema',
+      ];
+
+      // For the SQLite driver, also skip the 'attachedDatabases' property that
+      // is lazily populated in the connection init() method.
+      $skip_properties[] = 'attachedDatabases';
+
+      if (in_array($value->getName(), $skip_properties)) {
         continue;
       }
 
