Ваша точка 1 действительна в некоторой степени, но точка 2 о строках, попадающих в несобранный пул строк, верна только для статических литеральных строк (строк, которые появляются непосредственно в коде). Если вы хотите, чтобы пароли хранились непосредственно в вашем коде, я бы посоветовал сначала позаботиться об этом, так как их гораздо проще найти в файлах классов, чем в работающей виртуальной машине.
Так что, если вы считаете, что должны хранить свои пароли в char [], вы все равно можете создать объект String из него, прежде чем вызывать getConnection (). Если реализация драйвера не хранит строковый объект внутри, он быстро не будет доступен и, следовательно, будет собираться довольно быстро. Единственный шанс прочитать его тогда - это изучить память JVM непосредственно там, где она еще может существовать. Таким образом, вы правы, что использование char [] было бы немного более безопасным, но не настолько, как в любом случае пароль должен был бы быть в памяти в какой-то момент.
т.е. очень простой способ получить пароль с помощью любого API-интерфейса - ввести поддельный драйвер SQL и получить пароль непосредственно в методе connect. Любой, кто сможет проверить память JVM, чтобы найти в ней еще не перезаписанную строку пароля, также сможет вставить модифицированный драйвер.