mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 18:05:11 +03:00
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Bug fix. Link string changes only, no content changes. ## What is the current behavior? Nine inbound links in `apps/www` and `apps/studio` point at anchors on the connecting to Postgres guide that don't exist. All nine are already broken on production today: `#connection-pooler`, `#connection-pool`, `#how-connection-pooling-works`, `#serverside-poolers`, and `#connecting-with-drizzle` are all missing from the live page. #49869 moves the pooling content to a child page, so these links need current destinations either way. ## What is the new behavior? Point each link at the page that holds the content now. - **Studio, 3 links.** The Connect sheet's Drizzle link goes to the Drizzle guide. The connection pooling and pooling modes links go to `pooling-and-limits#how-connection-pooling-works`. - **www, 6 links.** Three blog posts, the Heroku comparison page, and the Dedicated poolers feature entry go to `pooling-and-limits`. The feature entry uses `#shared-pooler`. ## Additional context Split out of #49869. These paths belong to `@supabase/marketing` and `@supabase/Dashboard` in CODEOWNERS, and pulling both teams into a docs-only restructure for nine link strings isn't a good trade. Merge after #49928. The destinations don't exist on production until the docs pages land. ## Manual testing 1. Open [Supavisor: Scaling Postgres to 1 Million Connections](https://zone-www-dot-com-git-fix-pooler-docs-links-supabase.vercel.app/blog/supavisor-1-million). The "connection pooling" link in the opening paragraph resolves to `connecting-to-postgres/pooling-and-limits#how-connection-pooling-works`. 2. Open [Dedicated poolers](https://zone-www-dot-com-git-fix-pooler-docs-links-supabase.vercel.app/features/dedicated-poolers). The docs link resolves to `pooling-and-limits#shared-pooler`. 3. Open [Supabase vs Heroku Postgres](https://zone-www-dot-com-git-fix-pooler-docs-links-supabase.vercel.app/alternatives/supabase-vs-heroku-postgres). Both connection pooling links resolve to `pooling-and-limits#how-connection-pooling-works`. 4. Open [Connection pooling and limits](https://docs-git-docs-connecting-to-postgres-technical-supabase.vercel.app/docs/guides/database/connecting-to-postgres/pooling-and-limits) on the #49928 docs preview. The `how-connection-pooling-works` and `shared-pooler` headings both render with those IDs. 5. Open the Connect dialog on any project. Under Drizzle, the docs link opens the Drizzle guide. 6. Open Database settings, then Connection pooling. The pooler link opens Connection pooling and limits. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Updated connection pooling links across Studio, product pages, blogs, and comparison content to point to the relevant pooling guidance. * Refined links for Drizzle ORM, dedicated poolers, direct connections, and shared poolers. * Improved navigation to specific documentation sections explaining connection pooling modes and behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
118 lines
4.9 KiB
TypeScript
118 lines
4.9 KiB
TypeScript
import { useParams } from 'common'
|
|
import { AlertTriangleIcon } from 'lucide-react'
|
|
import {
|
|
Alert,
|
|
AlertDescription,
|
|
AlertTitle,
|
|
Button,
|
|
Dialog,
|
|
DialogClose,
|
|
DialogContent,
|
|
DialogDescription,
|
|
DialogFooter,
|
|
DialogHeader,
|
|
DialogSection,
|
|
DialogSectionSeparator,
|
|
DialogTitle,
|
|
} from 'ui'
|
|
|
|
import { Markdown } from '@/components/interfaces/Markdown'
|
|
import { DocsButton } from '@/components/ui/DocsButton'
|
|
import { useSupavisorConfigurationQuery } from '@/data/database/supavisor-configuration-query'
|
|
import { useHighAvailability } from '@/hooks/misc/useHighAvailability'
|
|
import { DOCS_URL } from '@/lib/constants'
|
|
import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector'
|
|
import { useDatabaseSettingsStateSnapshot } from '@/state/database-settings'
|
|
|
|
export const PoolingModesModal = () => {
|
|
const { ref: projectRef } = useParams()
|
|
const snap = useDatabaseSettingsStateSnapshot()
|
|
const state = useDatabaseSelectorStateSnapshot()
|
|
const { isHighAvailability, isPending: isHighAvailabilityPending } = useHighAvailability()
|
|
|
|
const { data } = useSupavisorConfigurationQuery(
|
|
{ projectRef: projectRef },
|
|
{ enabled: !isHighAvailability && !isHighAvailabilityPending }
|
|
)
|
|
const primaryConfig = data?.find((x) => x.identifier === state.selectedDatabaseId)
|
|
|
|
const navigateToPoolerSettings = () => {
|
|
const el = document.getElementById('connection-pooler')
|
|
if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' })
|
|
}
|
|
|
|
if (isHighAvailability) return null
|
|
|
|
return (
|
|
<Dialog open={snap.showPoolingModeHelper} onOpenChange={snap.setShowPoolingModeHelper}>
|
|
<DialogContent hideClose className="sm:max-w-4xl">
|
|
<DialogHeader>
|
|
<DialogTitle>
|
|
<div className="w-full flex items-center justify-between">
|
|
<p className="max-w-2xl">Which pooling mode should I use?</p>
|
|
<DocsButton
|
|
href={`${DOCS_URL}/guides/database/connecting-to-postgres/pooling-and-limits#how-connection-pooling-works`}
|
|
/>
|
|
</div>
|
|
</DialogTitle>
|
|
<DialogDescription className="max-w-2xl">
|
|
A connection pooler is a system (external to Postgres) which manages Postgres
|
|
connections by allocating connections whenever clients make requests.
|
|
</DialogDescription>
|
|
</DialogHeader>
|
|
<DialogSectionSeparator />
|
|
<DialogSection>
|
|
<Markdown
|
|
className="max-w-full [&>h3]:text-sm"
|
|
content={`
|
|
Each pooling mode handles connections differently.
|
|
|
|
### Transaction mode
|
|
This mode is recommended if you are connecting from *serverless environments*. A connection is assigned to the client for the duration of a transaction. Two consecutive transactions from the same client could be executed over two different connections. Some session-based Postgres features such as prepared statements are *not available* with this option.
|
|
|
|
### Session mode
|
|
This mode is similar to connecting to your database directly. There is full support for prepared statements in this mode. When a new client connects, a connection is assigned to the client until it disconnects. You *might run into pooler connection limits* since the connection is held till the client disconnects.
|
|
|
|
### Using session and transaction modes at the same time
|
|
${
|
|
primaryConfig?.pool_mode === 'transaction'
|
|
? 'You can use the session mode connection string (port 5432) and transaction mode connection string (port 6543) in your application.'
|
|
: 'To get the best of both worlds, as a starting point, we recommend using session mode just when you need support for prepared statements and transaction mode in other cases.'
|
|
}
|
|
`}
|
|
/>
|
|
</DialogSection>
|
|
{primaryConfig?.pool_mode === 'session' && (
|
|
<div className="px-6">
|
|
<Alert variant="warning">
|
|
<AlertTriangleIcon strokeWidth={2} />
|
|
<AlertTitle>Pooling mode is currently configured to use session mode</AlertTitle>
|
|
<AlertDescription>
|
|
To use transaction mode concurrently with session mode, change the pooling mode to
|
|
transaction first in the{' '}
|
|
<span
|
|
tabIndex={0}
|
|
className="text-foreground cursor-pointer underline underline-offset-2"
|
|
onClick={() => {
|
|
snap.setShowPoolingModeHelper(false)
|
|
navigateToPoolerSettings()
|
|
}}
|
|
>
|
|
connection pooling settings
|
|
</span>
|
|
. After this, you can use transaction mode on port 6543 and session mode on port
|
|
5432.
|
|
</AlertDescription>
|
|
</Alert>
|
|
</div>
|
|
)}
|
|
<DialogFooter>
|
|
<DialogClose onClick={() => snap.setShowPoolingModeHelper(false)}>
|
|
<Button variant="default">Close</Button>
|
|
</DialogClose>
|
|
</DialogFooter>
|
|
</DialogContent>
|
|
</Dialog>
|
|
)
|
|
}
|