Ваш учитель должен искать пулы соединений:)
Он прав, что открытие соединения с базой данных с аутентификацией и всем этим довольно дорого. Но эта проблема решается с пулами соединений. Таким образом, драйвер базы данных позаботится о том, чтобы соединение оставалось открытым.
Таким образом, вы можете просто открывать / закрывать соединение настолько открытым, насколько вы хотите: Открытие соединения проверит, существует ли уже открытое соединение в пуле соединений, а закрытие соединения просто вернет соединение в пул соединений.
Важно то, что время соединения может истечь. Так что, если вы просто пытаетесь держать одно соединение все время открытым, тогда вы можете получить исключение при попытке использовать соединение. (Некоторые драйверы могут открывать соединения автоматически, но большинство из них этого не делают.)
Так что мое предложение действительно таково: когда вам нужно соединение, откройте его, используйте его и закройте потом. И обязательно используйте пул соединений.
Но если вы действительно хотите нам синглтон, используйте его правильно. Класс Singleton обычно имеет закрытый конструктор и статический метод для получения экземпляра. Экземпляр является статической переменной, которая устанавливается внутри статического конструктора (поэтому он определяется как статический закрытый экземпляр MyClass = new MyClass ();) или getInstance проверяет, является ли экземпляр нулевым, и создает первый экземпляр, если требуется (используя синхронизированный если несколько потоков пытаются вызвать getInstance одновременно!)